龙空技术网

10个打开了我新世界大门的 WebAPI(上)「实践」

Echa攻城狮 1215

前言:

当前我们对“htmlaudioapi”可能比较讲究,各位老铁们都需要了解一些“htmlaudioapi”的相关知识。那么小编同时在网摘上搜集了一些对于“htmlaudioapi””的相关文章,希望朋友们能喜欢,兄弟们快快来了解一下吧!

作者:刘小夕

转发链接:

目录

10个打开了我新世界大门的 WebAPI(上)「实践」 本篇

10个打开了我新世界大门的 WebAPI(中)「实践」

10个打开了我新世界大门的 WebAPI(下)「实践」

前言

原来我对这些 Web API 一无所知,打开了我新世界的大门,未来 Web 可以做到更多,早日一统江湖吧,吼吼吼。

虽然这些 API 很多目前还存在兼容性的问题,但是还是有必要了解一下的,文中的代码,我已经都测试过了。希望你看完之后能够有所收获。

原文链接:

你可能已经知道并使用更为流行的 Web APIs(Web Worker,Fetch等),但也有少数不那么流行的 API,我个人喜欢使用,并建议你也尝试一下。

这篇文章中描述的所有 Web API 示例都可以在这里找到:

1. Web Audio API

Web Audio API 允许你在 Web 上操作音频流。它可用于向网络上的音频源添加效果和滤镜。

音频源可以来自 <audio>,视频/音频源文件或音频网络流。

让我们看一个简单的例子:

<body>    <header>        <h2>Web APIs<h2>    </header>    <div class="web-api-cnt">        <div class="web-api-card">            <div class="web-api-card-head"> Demo - Audio </div>            <div class="web-api-card-body">                <div id="error" class="close"></div>                <div>                    <audio controls src="./lovely.mp4" id="audio"></audio>                </div>                <div>                    <button onclick="audioFromAudioFile.init()">Init</button>                    <button onclick="audioFromAudioFile.play()">Play</button>                    <button onclick="audioFromAudioFile.pause()">Pause</button>                    <button onclick="audioFromAudioFile.stop()">Stop</button>                </div>                <div>                    <span>Vol: <input onchange="audioFromAudioFile.changeVolume()" type="range" id="vol" min="1" max="3"                            step="0.01" value="1" /></span>                    <span>Pan: <input onchange="audioFromAudioFile.changePan()" type="range" id="panner" min="-1"                            max="1" step="0.01" value="0" /></span>                </div>            </div>        </div>    </div></body><script>    const l = console.log    let audioFromAudioFile = (function () {        var audioContext        var volNode        var pannerNode        var mediaSource        function init() {            l("Init")            try {                audioContext = new AudioContext()                mediaSource = audioContext.createMediaElementSource(audio)                volNode = audioContext.createGain()                volNode.gain.value = 1                pannerNode = new StereoPannerNode(audioContext, { pan: 0 })                mediaSource.connect(volNode).connect(pannerNode).connect(audioContext.destination)                console.log(volNode)            }            catch (e) {                error.innerHTML = "The Web Audio API is not supported in this device."                error.classList.remove("close")            }        }        function play() {            audio.play()        }        function pause() {            audio.pause()        }        function stop() {            audio.stop()        }        function changeVolume() {            volNode.gain.value = document.getElementById('vol').value        }        function changePan() {            pannerNode.gain.value = tdocument.getElementById('panner').value        }        return {            init,            play,            pause,            stop,            changePan,            changeVolume        }    })()</script>

译者注:源代码有点小问题,上面的代码我已经修改过,可以运行,不过mp4文件换成自己本地有的。

此示例将音频从 <audio> 元素传递到 AudioContext。声音效果(例如声像)在添加到音频输出(扬声器)之前已添加到音频源。

单击 Init 按钮将调用 init 函数。这将创建一个 AudioContext 实例并将其设置为 audioContext。接下来,它创建一个媒体源createMediaElementSource(audio),将音频元素作为音频源传递。

createGain 创建音量节点 volNode。在这里,我们调整音频的音量。接下来,使用 StereoPannerNode 设置声像效果。最后,将节点连接到媒体源。

我们有一个音量和声像的滑块,拖动它们会影响音量和音频的声像效果。

这个例子有问题,所以该链接也无法正常使用,可以拷贝上面的代码在本地运行

try it:

2. Fullscreen API

Fullscreen API 让我们能够在 Web app 中启用全屏模式。它使你可以选择要在全屏模式下查看的元素。在 Android 手机中,它将删除浏览器窗口和 Android 顶部状态栏(显示网络状态,电池状态等的地方)。

方法:

requestFullscreen 在系统上以全屏模式显示选定的元素,从而关闭其他应用程序以及浏览器和系统UI元素。exitFullscreen 将全屏模式推出到正常模式。

让我们看一个简单的示例,其中我们可以使用全屏模式观看视频:

<body>    <header>        <h2>Web APIs<h2>    </header>    <div class="web-api-cnt">        <div class="web-api-card">            <div class="web-api-card-head"> Demo - Fullscreen </div>            <div class="web-api-card-body">                <div id="error" class="close"></div>                <div> This API makes fullscreen-mode of our webpage possible. It lets you select the Element you want to                    view in fullscreen-mode, then it shuts off the browsers window features like URL bar, the window                    pane, and presents the Element to take the entire width and height of the system. In Android phones,                    it will remove the browsers window and the Android UI where the network status, battery status are                    displayed, and display the Element in full width of the Android system. </div>                <div class="video-stage">                    <video id="video" src="./lovely.mp4"></video>                    <button onclick="toggle()">Toogle Fullscreen</button>                </div>                <div> This API makes fullscreen-mode of our webpage possible. It lets you select the Element you want to                    view in fullscreen-mode, then it shuts off the browsers window features like URL bar, the window                    pane, and presents the Element to take the entire width and height of the system. In Android phones,                    it will remove the browsers window and the Android UI where the network status, battery status are                    displayed, and display the Element in full width of the Android system. </div>            </div>        </div>    </div></body><script>    const l = console.log    function toggle() {        const videoStageEl = document.querySelector(".video-stage")        console.log(videoStageEl.requestFullscreen)        if (videoStageEl.requestFullscreen) {            if (!document.fullscreenElement) {                videoStageEl.requestFullscreen()            }            else {                document.exitFullscreen()            }        } else {            error.innerHTML = "Fullscreen API not supported in this device."            error.classList.remove("close")        }    }</script>

video 元素在 div#video-stage元素中,并带有一个按钮 Toggle Fullscreen。

当我们单击 Toggle Fullscreen 按钮时,我们希望使元素 div#video-stage 变为全屏显示。

看一下 toggle 这个函数:

function toggle() {    const videoStageEl = document.querySelector(".video-stage")    if(!document.fullscreenElement)        videoStageEl.requestFullscreen()    else        document.exitFullscreen()}

获取 div#video-stage 元素,并将其实例保留在 videoStageEl 上。

我们用过 document.fullsreenElement 属性可以知道该元素是否处于全屏模式,如果不是全屏模式,可以调用 videoStageEl 上的 requestFullscreen() 方法,使div#video-stage 接管整个设备视图。

如果在全屏模式下点击 Toggle Fullscreen 按钮,将会调用document.exitFullcreen() ,从而返回到普通视图。

try it:

注:该链接中的视频资源找不到了,但是全屏功能是正常的,大家也可以在本地测试

3. Web Speech API

Web Speech API 让我们可以将语音合成和语音识别功能添加到Web应用中。

使用此 API ,我们将能够向Web应用发出语音命令,就像在 Android 上通过其Google Speech 或像在Windows 中使用 Cortana 一样。

让我们看一个简单的例子。我们将看到如何使用 Web Speech API 实现文本到语音和语音到文本的转换。

<body>    <header>        <h2>Web APIs<h2>    </header>    <div class="web-api-cnt">        <div id="error" class="close"></div>        <div class="web-api-card">            <div class="web-api-card-head"> Demo - Text to Speech </div>            <div class="web-api-card-body">                <div>                    <input placeholder="Enter text here" type="text" id="textToSpeech" />                </div>                <div>                    <button onclick="speak()">Tap to Speak</button>                </div>            </div>        </div>        <div class="web-api-card">            <div class="web-api-card-head"> Demo - Speech to Text </div>            <div class="web-api-card-body">                <div>                    <textarea placeholder="Text will appear here when you start speeaking."                        id="speechToText"></textarea>                </div>                <div>                    <button onclick="tapToSpeak()">Tap and Speak into Mic</button>                </div>            </div>        </div>    </div></body><script>    try {        var speech = new SpeechSynthesisUtterance()        var recognition = new SpeechRecognition()    } catch (e) {        error.innerHTML = "Web Speech API not supported in this device."        error.classList.remove("close")    }    function speak() {        speech.text = textToSpeech.value        speech.volume = 1        speech.rate = 1        speech.pitch = 1        alert(window.speechSynthesis)        window.speechSynthesis.speak(speech)    }    function tapToSpeak() {        recognition.onstart = function () { }        recognition.onresult = function (event) {            const curr = event.resultIndex            const transcript = event.results[curr][0].transcript            speechToText.value = transcript        }        recognition.onerror = function (ev) {            console.error(ev)        }        recognition.start()    }</script>

第一个演示 Demo - Text to Speech 演示了通过一个简单的输入框接收输入的文字以及一个按钮点击后输出语音的功能。

看一下 speak 函数:

function speak() {    speech.text = textToSpeech.value    speech.volume = 1    speech.rate = 1    speech.pitch = 1    window.speechSynthesis.speak(speech)}

它实例化 SpeechSynthesisUtterance() 对象,将我们在输入框中输入的文本转换为语音。然后,调用语音对象 SpeechSynthesis 的 speak 函数,使输入框中的文本在我们的扬声器中放出。

第二个演示 Demo - Speech to Text 是语音识别演示。我们点击 Tap and Speak into Mic 按钮,对着麦克风说话,我们说的单词就被翻译成了文本。

Tap and Speak into Mic 按钮单击后调用 tapToSpeak 函数:

function tapToSpeak() {    recognition.onstart = function () { }    recognition.onresult = function (event) {        const curr = event.resultIndex        const transcript = event.results[curr][0].transcript        speechToText.value = transcript    }    recognition.onerror = function (ev) {        console.error(ev)    }    recognition.start()}

很简单,实例化 SpeechRecognition,然后注册事件处理程序和回调。在语音识别开始时调用 onstart,在发生错误时调用 onerror 。每当语音识别捕获到一条线时,就会调用 onresult。

可以看到,在 onresult 回调中,我们提取文本并将其设置到文本区域。所以当我们对着麦克风说话时,这些内容会输出在文本区域中。

try it:

译者:我的爪机和电脑 Chrome(V83) 都不能支持该 API。

4. Bluetooth API

实验技术

Bluetooth API 使得我们可以访问手机上的低功耗蓝牙设备,并使用它来将网页中的数据共享到另一台设备上。

想象一下能够创建一个Web聊天应用,该应用程序可以通过蓝牙发送和接收来自其他手机的消息。

基础 API 是 navigator.bluetooth.requestDevice。调用它将使浏览器提示用户选择一个设备,使他们可以选择一个设备或取消请求。

navigator.bluetooth.requestDevice 需要一个对象。该对象定义了用于返回与过滤器匹配的蓝牙设备的过滤器。

让我们看一个简单的演示。本演示将使用navigator.bluetooth.requestDeviceAPI 从BLE设备检索基本设备信息。

<body>    <header>        <h2>Web APIs<h2>    </header>    <div class="web-api-cnt">        <div class="web-api-card">            <div class="web-api-card-head"> Demo - Bluetooth </div>            <div class="web-api-card-body">                <div id="error" class="close"></div>                <div>                    <div>Device Name: <span id="dname"></span></div>                    <div>Device ID: <span id="did"></span></div>                    <div>Device Connected: <span id="dconnected"></span></div>                </div>                <div>                    <button onclick="bluetoothAction()">Get BLE Device</button>                </div>            </div>        </div>    </div></body><script>    function bluetoothAction() {        if (navigator.bluetooth) {            navigator.bluetooth.requestDevice({                acceptAllDevices: true            }).then(device => {                dname.innerHTML = device.name                did.innerHTML = device.id                dconnected.innerHTML = device.connected            }).catch(err => {                error.innerHTML = "Oh my!! Something went wrong."                error.classList.remove("close")            })        } else {            error.innerHTML = "Bluetooth is not supported."            error.classList.remove("close")        }    }</script>

设备的信息会展示出来。单击按钮 Get BLE Device 则调用 bluetoothAction 函数。

function bluetoothAction() {    if (navigator.bluetooth) {        navigator.bluetooth.requestDevice({            acceptAllDevices: true        }).then(device => {            dname.innerHTML = device.name            did.innerHTML = device.id            dconnected.innerHTML = device.connected        }).catch(err => {            error.innerHTML = "Oh my!! Something went wrong."            error.classList.remove("close")        })    } else {        error.innerHTML = "Bluetooth is not supported."        error.classList.remove("close")    }}

该 bluetoothAction 函数调用 navigator.bluetooth.requestDevice API,参数设置为 acceptAllDevices: true,这将使其扫描并列出附近所有开启了蓝牙的设备。它返回的是一个 Promise。

try it:

译者注:电脑上 Chrome 浏览器上测试了下,是支持该API的。

未完结,请见下一篇

推荐JavaScript经典实例学习资料文章

《「图文」ESLint 在中大型团队的应用实践》

《Deno是代码的浏览器,你认同吗?》

《前端存储除了 localStorage 还有啥?》

《Javascript 多线程编程​的前世今生》

《微前端方案 qiankun(实践及总结)》

《「图文」V8 垃圾回收原来这么简单?》

《Webpack 5模块联邦引发微前端的革命?》

《基于 Web 端的人脸识别身份验证「实践」》

《「前端进阶」高性能渲染十万条数据(时间分片)》

《「前端进阶」高性能渲染十万条数据(虚拟列表)》

《图解 Promise 实现原理(一):基础实现》

《图解 Promise 实现原理(二):Promise 链式调用》

《图解 Promise 实现原理(三):Promise 原型方法实现》

《图解 Promise 实现原理(四):Promise 静态方法实现》

《实践教你从零构建前端 Lint 工作流「干货」》

《高性能多级多选级联组件开发「JS篇」》

《深入浅出讲解Node.js CLI 工具最佳实战》

《延迟加载图像以提高Web网站性能的五种方法「实践」》

《比较 JavaScript 对象的四种方式「实践」》

《使用Service Worker让你的 Web 应用如虎添翼(上)「干货」》

《使用Service Worker让你的 Web 应用如虎添翼(中)「干货」》

《使用Service Worker让你的 Web 应用如虎添翼(下)「干货」》

《前端如何一次性处理10万条数据「进阶篇」》

《推荐三款正则可视化工具「JS篇」》

《如何让用户选择是否离开当前页面?「JS篇」》

《JavaScript开发人员更喜欢Deno的五大原因》

《仅用18行JavaScript实现一个倒数计时器》

《图文细说JavaScript 的运行机制》

《一个轻量级 JavaScript 全文搜索库,轻松实现站内离线搜索》

《推荐Web程序员常用的15个源代码编辑器》

《10个实用的JS技巧「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(一)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(二)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(三)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(四)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(五)「值得收藏」》

《细品269个JavaScript小函数,让你少加班熬夜(六)「值得收藏」》

《深入JavaScript教你内存泄漏如何防范》

《手把手教你7个有趣的JavaScript 项目-上「附源码」》

《手把手教你7个有趣的JavaScript 项目-下「附源码」》

《JavaScript 使用 mediaDevices API 访问摄像头自拍》

《手把手教你前端代码如何做错误上报「JS篇」》

《一文让你彻底搞懂移动前端和Web 前端区别在哪里》

《63个JavaScript 正则大礼包「值得收藏」》

《提高你的 JavaScript 技能10 个问答题》

《JavaScript图表库的5个首选》

《一文彻底搞懂JavaScript 中Object.freeze与Object.seal的用法》

《可视化的 JS:动态图演示 - 事件循环 Event Loop的过程》

《教你如何用动态规划和贪心算法实现前端瀑布流布局「实践」》

《可视化的 js:动态图演示 Promises & Async/Await 的过程》

《原生JS封装拖动验证滑块你会吗?「实践」》

《如何实现高性能的在线 PDF 预览》

《细说使用字体库加密数据-仿58同城》

《Node.js要完了吗?》

《Pug 3.0.0正式发布,不再支持 Node.js 6/8》

《纯JS手写轮播图(代码逻辑清晰,通俗易懂)》

《JavaScript 20 年 中文版之创立标准》

《值得收藏的前端常用60余种工具方法「JS篇」》

《箭头函数和常规函数之间的 5 个区别》

《通过发布/订阅的设计模式搞懂 Node.js 核心模块 Events》

《「前端篇」不再为正则烦恼》

《「速围」Node.js V14.3.0 发布支持顶级 Await 和 REPL 增强功能》

《深入细品浏览器原理「流程图」》

《JavaScript 已进入第三个时代,未来将何去何从?》

《前端上传前预览文件 image、text、json、video、audio「实践」》

《深入细品 EventLoop 和浏览器渲染、帧动画、空闲回调的关系》

《推荐13个有用的JavaScript数组技巧「值得收藏」》

《前端必备基础知识:window.location 详解》

《不要再依赖CommonJS了》

《犀牛书作者:最该忘记的JavaScript特性》

《36个工作中常用的JavaScript函数片段「值得收藏」》

《Node + H5 实现大文件分片上传、断点续传》

《一文了解文件上传全过程(1.8w字深度解析)「前端进阶必备」》

《【实践总结】关于小程序挣脱枷锁实现批量上传》

《手把手教你前端的各种文件上传攻略和大文件断点续传》

《字节跳动面试官:请你实现一个大文件上传和断点续传》

《谈谈前端关于文件上传下载那些事【实践】》

《手把手教你如何编写一个前端图片压缩、方向纠正、预览、上传插件》

《最全的 JavaScript 模块化方案和工具》

《「前端进阶」JS中的内存管理》

《JavaScript正则深入以及10个非常有意思的正则实战》

《前端面试者经常忽视的一道JavaScript 面试题》

《一行JS代码实现一个简单的模板字符串替换「实践」》

《JS代码是如何被压缩的「前端高级进阶」》

《前端开发规范:命名规范、html规范、css规范、js规范》

《【规范篇】前端团队代码规范最佳实践》

《100个原生JavaScript代码片段知识点详细汇总【实践】》

《关于前端174道 JavaScript知识点汇总(一)》

《关于前端174道 JavaScript知识点汇总(二)》

《关于前端174道 JavaScript知识点汇总(三)》

《几个非常有意思的javascript知识点总结【实践】》

《都2020年了,你还不会JavaScript 装饰器?》

《JavaScript实现图片合成下载》

《70个JavaScript知识点详细总结(上)【实践】》

《70个JavaScript知识点详细总结(下)【实践】》

《开源了一个 JavaScript 版敏感词过滤库》

《送你 43 道 JavaScript 面试题》

《3个很棒的小众JavaScript库,你值得拥有》

《手把手教你深入巩固JavaScript知识体系【思维导图】》

《推荐7个很棒的JavaScript产品步骤引导库》

《Echa哥教你彻底弄懂 JavaScript 执行机制》

《一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧》

《深入解析高频项目中运用到的知识点汇总【JS篇】》

《JavaScript 工具函数大全【新】》

《从JavaScript中看设计模式(总结)》

《身份证号码的正则表达式及验证详解(JavaScript,Regex)》

《浏览器中实现JavaScript计时器的4种创新方式》

《Three.js 动效方案》

《手把手教你常用的59个JS类方法》

《127个常用的JS代码片段,每段代码花30秒就能看懂-【上】》

《深入浅出讲解 js 深拷贝 vs 浅拷贝》

《手把手教你JS开发H5游戏【消灭星星】》

《深入浅出讲解JS中this/apply/call/bind巧妙用法【实践】》

《手把手教你全方位解读JS中this真正含义【实践】》

《书到用时方恨少,一大波JS开发工具函数来了》

《干货满满!如何优雅简洁地实现时钟翻牌器(支持JS/Vue/React)》

《手把手教你JS 异步编程六种方案【实践】》

《让你减少加班的15条高效JS技巧知识点汇总【实践】》

《手把手教你JS开发H5游戏【黄金矿工】》

《手把手教你JS实现监控浏览器上下左右滚动》

《JS 经典实例知识点整理汇总【实践】》

《2.6万字JS干货分享,带你领略前端魅力【基础篇】》

《2.6万字JS干货分享,带你领略前端魅力【实践篇】》

《简单几步让你的 JS 写得更漂亮》

《恭喜你获得治疗JS this的详细药方》

《谈谈前端关于文件上传下载那些事【实践】》

《面试中教你绕过关于 JavaScript 作用域的 5 个坑》

《Jquery插件(常用的插件库)》

《【JS】如何防止重复发送ajax请求》

《JavaScript+Canvas实现自定义画板》

《Continuation 在 JS 中的应用「前端篇」》

作者:刘小夕

转发链接:

标签: #htmlaudioapi #ajax请求webapi #webapiajax下载文件