前端必学必会 - 多媒体 - 本地存储 - 浏览器与服务器的交互 - 通信功能

前言
哪吒人生信条:如果你所学的东西 处于喜欢 才会有强大的动力支撑。
每天学习编程,让你离梦想更新一步,感谢不负每一份热爱编程的程序员,不论知识点多么奇葩,和我一起,让那一颗四处流荡的心定下来,一直走下去,加油,2021
加油!欢迎关注加我vx:xiaoda0423
,欢迎点赞、收藏和评论
不要害怕做梦,但是呢,也不要光做梦,要做一个实干家,而不是空谈家,求真力行。
多媒体
多媒体,你想到了什么?我想到了video
元素和audio
元素。
学习元素的知识点,涉及属性,方法,事件。在 HTML5 出现前,展示视频,音频,动画等,都是使用第三方自主开发,使用最多的工具是flash
了。
现在通过 HTML5 技术提供的音频视频接口就不用安装插件了。
媒体是对音频和视频一类的总称。

video
元素是用来播放网络上的视频的audio
元素是用来播放网络上的音频的
使用audio
元素:
<audio src="http://test.mp3">
</audio>
使用video
元素:
<video width="640" height="360" src="">
</video>
使用source
元素:该元素可以为同一个媒体数据指定多个播放格式与编码方式,以确保浏览器可以从中选择一种自己支持的播放格式进行播放。
<video>
<source src="test.ogv" type='video/ogg; codecs="theora, vorbis"'>
<source src="text.mov" type="video/quicktime">
</video>
顺序从上到下判断自己对该播放格式是否支持,直到找到为止。
|参数| 描述|
|:---|:---|
|src|播放媒体的 url 地址|
|type|媒体类型|
`audio`元素和`video`元素
共有的属性:
<video src="text.mov" autoplay></video>
|参数| 描述|
|:---|:---|
|src|指定媒体数据的 url 地址|
|autoplay|指定媒体是否在页面加载后自动播放|
|preload|指定视频或音频数据是否预加载|
|loop|指定是否循环播放视频或者音频|
|controls|指定是否为视频或者音频添加浏览器自带的播放用的控制条|
preload
的属性值,none
表示为不进行预加载。metadata
表示只预加载媒体的元数据。auto
表示预加载全部视频或音频。
<video src="" preload="auto"></video>
poster
它是video
元素独有属性,当视频不可用时,可以使用该元素用图片代替,避免在视频的区域出现一片空白。
<video src="" poster="image.jpg"></video>
<video src="" autoplay loop></video>
<video src="" controls></video>
width
和height
为视频的宽度和高度,是video
元素独有的属性。
<video src="" width="500" height="500"></video>
error 属性
一般正常情况,video
元素或者audio
元素的error
属性为null
。
出现错误时,返回一个MediaError
对象,该对象的code
返回对于的错误状态值。

media_err_aborted
,媒体数据的下载过程由于用户的操作原因而被中止。
media_err_network
,确认媒体资源可用,但是在下载时出现网络错误,媒体数据的下载过程被中止。
media_err_decode
,确认媒体资源可用,但是解码时发生错误。
media_err_src_not_supported
,媒体格式不被支持。
`networkState`属性
networkState
属性用于读取当前网络的状态。

network_empty
为元素处于初始状态network_idle
为浏览器已经处理好用什么编码格式来播放媒体,但就是未建立网络连接network_loading
为媒体数据加载中network_no_source
为没有支持的编码格式,不执行加载
`currentSrc`属性
currentSrc
用来读取播放中的媒体数据的url
地址
buffered 属性
使用buffered
属性,会返回一个对象,该对象实现TimeRanges
接口,用来确认是否已缓存媒体数据。
TimeRanges
对象表示一段时间范围,,一般情况下,大都是表示时间范围是一个单一的以 0 开始的范围。
如果浏览器发出
Range Requests
请求,那么这个TimeRanges
对象表示的时间范围是多个时间范围。
在这个对象中,有一个length
属性,表示有多少个时间范围。
一般情况下,存在时间范围时,该值为 1;不存在时间范围时,该值为 0.

一般情况下index
为 0:
TimeRanges.start(0)
表示当前缓存区内从什么时间开始进行缓存TimeRanges.end(0)
表示当前缓存区内从什么时间结束缓存
`readyState`属性
readyState
属性返回媒体当前播放位置的就绪状态。

have_nothing
表示没有获取到媒体的信息,当前播放位置没有可播放的数据。have_metadata
表示已有获取到足够的媒体数据,但是当前播放位置没有有效的媒体数据。have_current_data
表示已有播放的数据,但是没有让播放器前进的数据。就是视频有当前帧的数据,却没有下一帧的数据,或已是最后一帧。have_future_data
表示当前有播放的数据,也有播放前进的数据的数据,当最后播放一帧时,readyState
属性不可能为havefuturedata
。have_enough_data
表示当前有播放的数据,也有前进的数据,保证了后续有足够的数据进行播放。
`seeking`属性和`seekable`属性
seeking
属性返回一个布尔值:
true
表示浏览器正在请求数据false
表示浏览器已经停止请求
seekable
属性返回一个TimeRanges
对象,该对象表示请求到的数据的时间范围。
开始时间:请求到数据的第一帧的时间
结束时间:请求到数据的最后一帧的时间
`currentTime`属性,`startTime`属性,`duration`属性
currentTime
属性用来修改当前播放位置,以及读取媒体的当前播放位置。
startTime
属性来读取媒体播放的开始时间,通常为 0。
duration
属性用来读取媒体文件总的播放时间。
`played`属性,`paused`属性,`ended`属性
played
属性返回一个TimeRanges
对象,表示读取媒体文件的已播放部分的时间段。
开始时间为已播放的开始时间
结束时间为已播放的结束时间
paused
属性返回一个布尔值,表示是否处于暂停播放
true
表示暂停播放false
表示正在播放
`defaultPlaybackRate`属性与`playbackRate`属性
defaultPlaybackRate
属性读取或修改媒体默认的播放速率
playbackRate
属性读取或修改媒体当前的播放速率。
`volume`属性和`muted`属性
volume
属性:读取或修改媒体的播放音量,值 0 到 1
muted
属性读取或修改媒体的静音状态,值为布尔值
true
为静音状态false
为非静音状态
方法
都有的四种方法:

`canPlayType`方法
canPlayType
方法用来测试浏览器是否支持指定的媒体类型
var support = videoElement.canPlayType(type)

事件
对媒体数据进行一系列的事件。

第一种:
videoElement.addEventListener(type,listener,useCapture)
video.addEventListener("error", function()
{
...
},false);
第二种:
<video id="video1" src="" onplay=“begin();”></video>
function begin()
{
...
}
事件方法
| 事件 | 描述 |
|:---|:---|
|loadstart|浏览器开始找媒体数据|
|progress|浏览器正在获取媒体数据|
|suspend|浏览器暂停获取媒体数据,但下载过程并没有结束|
|abort|中止获取媒体数据,并不是由错误引起的|
|error|获取媒体数据过程中出错|
|emptied|所在网络变为未初始化状态:1,载入媒体过程中出现错误;2,在浏览器选择支持的播放格式时,又调用了 load 方法|
|stalled|浏览器尝试获取媒体数据失败|
|play|播放|
|pause|播放暂停|
|loadedmetadata|浏览器获取完毕媒体的时间长和字节数|
|loadeddata|浏览器已加载完毕当前播放的媒体数据|
|waiting|播放过程由于获取不到下一帧就暂停播放,但是很快就恢复了,又能得到下一帧|
|playing|正在播放|
|canplay|能够播放,播放的速率不能够直接将媒体播放完毕,播放期间需要缓冲|
|canplaythrough|能够播放,播放速率也可以,所以不用进行缓冲|
|seeking|为 true 时,表示正在请求数据|
|seeked|为 false 时,表示停止请求数据|
|timeupdate|表示当前播放位置被改变|
|ended|播放结束后停止播放|
|ratechange|defaultplaybackRate 属性或 playbackRate 属性被改变|
|durationchange|播放时长被改变|
|volumechange|音量,volume 属性被改变或静音状态 muted 属性被改变|
本地存储
`web Storage`与本地数据库
HTML5 中的两个重要内容:Web Storage
与本地数据库。
Web Storage
存储机制是对 HTML4 中cookies
存储机制的一个改良,HTML5 转试用改良后的Web Storage
存储机制。
本地数据库是hmtl5
中新增的一个功能,可以保存在客户端本地建立一个数据库。---大大减轻了服务器端的负担,加快了访问数据的速度。
了解
sessionStorage
和localStorage
,以及两者之间的区别openDatabase
方法创建与打开数据库transaction
方法进行事务的处理
sessionStorage
sessionStorage
属性允许你访问一个 session Storage
对象。它与 localStorage
相似,不同在于 localStorage
里面存储的数据没有过期时间设置,而存储在 sessionStorage
里面的数据在页面会话结束时会被清除。
页面会话在浏览器打开期间一直保持,并且重新加载或恢复页面仍会保持原来的页面会话。
在新标签或窗口打开一个页面时会复制顶级浏览会话的上下文作为新会话的上下文,这点和 session cookies
的运行方式不同。
语法
// 保存数据到 sessionStorage
sessionStorage.setItem('key', 'value');
// 从 sessionStorage 获取数据
let data = sessionStorage.getItem('key');
// 从 sessionStorage 删除保存的数据
sessionStorage.removeItem('key');
// 从 sessionStorage 删除所有保存的数据
sessionStorage.clear();


Window sessionStorage
属性
// 存储
sessionStorage.setItem("lastname", "Jeskson");
// 检索
document.getElementById("result").innerHTML = sessionStorage.getItem("lastname");
定义和使用
localStorage
和 sessionStorage
属性允许在浏览器中存储 key/value
对的数据
sessionStorage
用于临时保存同一窗口的数据,在关闭窗口或标签页之后将会删除这些数据。
如果你想在浏览器窗口关闭后还保留数据,可以使用
localStorage
属性

localStorage
只读的localStorage
属性允许你访问一个Document
源的对象 Storage
;存储的数据将保存在浏览器会话中。
存储在 localStorage
的数据可以长期保留;当页面被关闭时,存储在 sessionStorage
的数据会被清除 。
// 存储
localStorage.setItem("lastname", "Jeskson");
// 检索
document.getElementById("result").innerHTML = localStorage.getItem("lastname");
在浏览器的API
有两个:
localStorage
sessionStorage
存在于window
对象中:
localStorage
对应window.localStorage
sessionStorage
对应window.sessionStorage
`localStorage` 的优势
localStorage
拓展了cookie
的4K
限制。
localStorage
将第一次请求的数据直接存储到本地,相当于一个 5M
大小的数据库,相比于 cookie
可以节约带宽,这个只有在高版本的浏览器中才支持的。
`localStorage` 的局限
浏览器的大小不统一,并且在 IE8
以上的 IE
版本才支持 localStorage
这个属性。
目前的浏览器中都会把localStorage
的值类型限定为string
类型,这个在我们日常比较常见的JSON
对象类型需要一些转换。
localStorage
在浏览器的隐私模式下面是不可读取的。
localStorage
本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡。localStorage
不能被爬虫抓取到。
`localStorage` 使用
使用 localStorage
,我需要判断浏览器是否支持 localStorage
:
if(! window.localStorage){
alert("浏览器不支持 localstorage");
return false;
}else{
//主逻辑业务
}
特别说明一下
localStorage
使用也是遵循同源策略的,不同的网站是不能共用相同的 localStorage
。
localStorage
只支持 string
类型的存储。
一般我们会将
JSON
存入localStorage
中,在localStorage
会自动将localStorage
转换成为字符串形式。
使用 JSON.stringify()
这个方法,将 JSON
转换为 JSON
**字符串**。读取之后要将 JSON
字符串转换成为 JSON
对象,使用 JSON.parse()
方法。
`HTML5 LocalStorage` 本地存储

什么是`Web Storage`
随着网络存储,Web 应用程序可以在用户的浏览器本地存储数据。
HTML5 之前,应用程序数据必须存储在cookie
中,包含在每一个服务器的请求。网络存储更安全,以及大量的数据可以在本地存储,而不会影响网站的性能。
web
存储是每原点(每个域和协议)。所有页面,从一个起源,可以存储和访问相同的数据。
Web Storage
就是在Web
上存储数据的功能。
Web Storage
功能可以在客户端本地保存数据的Web Storage
功能。
`cookies`存储永久数据存在的问题。

`Web Storage`分两种:
sessionStorage
,将数据存储在session
对象中,就是用户在浏览某个网站时,从进入到浏览器关闭的这段时间,session
对象可以用来保存在这段时间内所要求保存的任何数据。localStorage
,将数据保存在客户端本地的硬件设备,浏览器关闭后,数据还在,下次重新打开浏览器访问网站时就可以继续使用了。
使用方法
sessionStorage
保存数据:
sessionStorage.setItem(key,value)
读取数据:
变量=sessionStorage.getItem(key)
localStorage
保存数据:
localStorage.setItem(key,value)
读取数据:
变量=localStorage.getItem(key)

Web Storage 包含如下两种机制
sessionStorage
,localStorage
`Web Storage` 接口
`Storage`
允许你在一个特定域中设置,检索和删除数据和储存类型
`Window`
Web Storage API
继承于Window
对象,并提供两个新属性
Window.sessionStorage
Window.localStorage
它们分别地提供对当前域的会话和本地Storage
对象的访问。
`StorageEvent`
当一个存储区更改时,存储事件从文档的 Window
对象上被发布。
saveStorage
函数loadStorage
函数clearStorage
函数
将对象转换成json
格式的文本数据,使用json
对象的stringify
方法。
var str=JSON.stringify(data);
将从localStorage
中获取的数据转换成JSON
对象。
var data = JSON.parse(str);
简单数据库脚本代码:
function saveStorage()
{
var data=new Object;
data.name=document.getElementById('name').value;
var str = JSON.stringify(data);
localStorage.setItem(data.name, str);
}
function findStorage(id)
{
var find = document.getElementById('find').value;
var str = localStorage.getItem(find);
var data = JSON.parse(str);
var result = data.name;
var target = document.getElementById(id);
target.innerHTML = result;
}
`cookie` (储存在用户本地终端上的数据)
Cookie
是保存在客户端的纯文本文件。比如txt
文件。
客户端就是我们自己的本地电脑。当我们通过浏览器进行访问网页的时候,服务器会生成一个证书并返回给我的浏览器并写入我们的本地电脑。
这个证书是cookie
。一般来说,cookie
都是服务器端写入客户端的纯文本文件。
Cookie
文件由浏览器的支持,在浏览器中可以设置阻止cookie
。这样服务器端就不能写入cookie
到客户端了。
一般来说,cookie
是不能阻止的,这样做就访问不到了。

当服务器收到HTTP
请求时,服务器可以在响应头里面添加一个Set-Cookie
选项。
服务器使用Set-Cookie
响应头部向用户代理发送Cookie
信息。

把不需要存储在服务上的数据,称为SQLLite
的文件型SQL
数据库。
使用`SQLLite`数据库
创建访问数据库的对象
使用事务处理
var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
返回创建后的数据库访问对象。如数据库不存在,就创建该数据库。
|参数|描述|
|:---|:---|
|第一个参数|数据库名|
|第二个参数|版本号|
|第三个参数|数据库的描述|
|第四个参数|数据库的大小|
调用transaction
方法,用来执行事务处理。
transaction
方法:
db.transaction(function(tx){
tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS(id unique,Log)');
})
用`executeSql`来执行查询语句
executeSql
方法:
transaction.executeSql(sqlquery,[],dataHandler,errorHandler);
|参数|描述|
|:---|:---|
|第一个参数|需要执行的 sql 语句|
|第二个参数|需要 sql 语句中所使用到的参数的数组|
|第三个参数|执行 sql 语句成功时调用的回调函数|
|第四个参数|执行 sql 语句出错时调用的回调函数|
代码:
// 第二个参数
transaction.executeSql('UPDATE people set age=? where name=?;', [age,name]);
// 第三个参数
function dataHandler(transaction,results){}
// 第四个参数
function errorHandler(transaction, errmsg){}
离线应用程序

HTML5
中提供了一个本地缓存使用的api
,可以实现离线web
应用程序的开发。
面试官问:什么是离线`web`应用程序
HTML5 离线功能,对离线应用开发的支持就是 HTML5 中一个新特性。
关于离线的web
应用程序,需要了解三个方面的功能:
离线资源缓存
在线状态检测
本地数据存储
什么是离线资源缓存
HTML5
提供一种应用程序缓存机制,使得基于web
的应用程序可以离线运行。

就是用一种方式表名应用程序在离线工作时所需要的资源文件。这样,当浏览器在在线状态时,就可以把这些文件缓存到本地,往后,当用户在离线状态下,访问应用程序时,这些资源文件就会自动加载,从而让用户正常使用浏览。
在 HTML5 中,通过使用cache manifest
,表明了缓存的资源,并支持自动和手动两种缓存方式。

什么是在线检测
开发者需要了解浏览器是否在线,对其进行操作,在 HTML5 中,提供了检测当前网络是否在线的方式。
什么是本地数据缓存
离线时,将数据存储到本地,为了满足需要,HTML5 提供了DOM Storage
和 Web SQL Database
两种存储机制。
HTML5
的 DOM Storage
机制提供了一种方式让程序员能够把信息存储到本地的计算机上,在需要时获取。
`DOM Storage` 两个分类
DOM Storage
分为 sessionStorage
和 localStorage
。
本地缓存与浏览器网页缓存的区别
本地缓存是为整个 web 应用程序服务的,而浏览器的网页缓存是为单个网页服务的。
任何网页都具有网页缓存,而本地缓存只有那些用户指定缓存的网页。
网页缓存不是安全的,不可靠,也不知道它到底缓存了哪些网页,哪些资源。
本地缓存是可靠的,可以控制对哪些内容进行缓存,不对哪些内容进行缓存。
面试官问:什么是`manifest`文件
web
应用程序的本地缓存是通过每个页面的manifest
文件来管理的。manifest
文件是一个简单的文本文件。

为了让浏览器能够正常阅读文本文件,需要在web
应用程序页面上的html
标签的manifest
属性中指定manifest
文件的url
地址。
面试官问:什么是`applicationCache`对象
applicationCache
对象代表了本地缓存,用它可以通知用户本地缓存已经被更新。
代码:
applicationCache.onUpdateReady = function(){
// 本地缓存已被更新,通知用户
alert()
};
浏览器与服务器的交互
过程:
浏览器请求访问地址
服务器返回
index.html
网页浏览器解析
index.html
网页,请求网页上的所有 资源文件服务器返回所有资源文件
浏览器处理
manifest
文件,请求mnifest
中所有要求本地缓存的文件。服务器返回所有要求本地缓存的文件。
浏览器对本地缓存进行更新,通知本地缓存被更新。
`swapCache`方法
本地缓存准备被更新,该方法用来手工执行本地缓存更新。
使用前提
在applicationCache
对象的updateReady
事件被触发调用,updateReady
事件只有在服务器上的manifest
文件被更新,在manifest
文件中所要求的资源文件下载到本地后。
代码:
applicationCache.onUpdateReady = function() {
// 本地缓存已被更新,通知用户
alert();
applicationCache.swapCache();
}
跨文档消息传输
什么是同源,所谓"同源"指的是"三个相同"。
协议相同
域名相同
端口相同
同源的目的是为了保证用户信息的安全,防止恶意的网站窃取数据。所谓“同域限制”是指同样协议、同样域名、同样端口的地址进行通信。
使用跨文档消息传输功能,可以在不同网页文档,不同端口,不同域之间进行消息的传递。
对窗口对象的message
事件进行监视。
代码:
window.addEventListener("message", function(){...},false);
使用window
对象的postMessage
方法向其他窗口发送消息。
otherWindow.postMessage(message, targetOrigin);
|参数|描述|
|:---|:---|
|第一个参数|所发送的消息文本|
|第二个参数|接收消息的对象窗口的 url 地址|
`Web Sockets`通信
web sockets
是html5
提供的在web
应用程序中客户端与服务端之间进行的非http
的通信机制。
有了 HTTP 协议,为什么需要另一个协议。
因为 HTTP 协议有一个缺陷,通信只能由客户端发起。(客户端向服务器发出请求,服务器返回查询结果。)
WebSocket
协议最大的特点就是,服务器可以自动向客户端推送消息,客户端也可以主动向服务器发送消息。

WebSocket
对象作为一个构造函数,用于新建 WebSocket
实例。
实例对象的onopen
属性,指定连接成功后的回调函数。
代码:
ws.onopen = function () {
ws.send('Hello Server!');
}
使用addEventListener
方法
ws.addEventListener('open', function (event) {
ws.send('Hello Server!');
});
代码,客户端的简单示例:
var ws = new WebSocket("wss://index.org");
ws.onopen = function(evt) {
console.log("Connection open ...");
// 实例对象的 send()方法用于向服务器发送数据。
ws.send("Hello WebSockets!");
};
// 实例对象的 onmessage 属性,用于指定收到服务器数据后的回调函数
ws.onmessage = function(evt) {
console.log( "Received Message: " + evt.data);
ws.close();
};
// 实例对象的 onclose 属性,用于指定连接关闭后的回调函数
ws.onclose = function(evt) {
console.log("Connection closed.");
};


代码:
// When the connection is open, send some data to the server
// 实例对象的 onopen 属性,用于指定连接成功后的回调函数。
connection.onopen = function () {
// 实例对象的 send()方法用于向服务器发送数据。
connection.send('Ping'); // Send the message 'Ping' to the server
};
// Log errors
// 实例对象的 onerror 属性,用于指定报错时的回调函数。
connection.onerror = function (error) {
console.log('WebSocket Error ' + error);
};
// Log messages from the server
// 实例对象的 onmessage 属性,用于指定收到服务器数据后的回调函数。
connection.onmessage = function (e) {
console.log('Server: ' + e.data);
};
WebSocket 是什么?

WebSocket
是一种网络通信协议。
代码:
var webSocket = new WebSocket("");
url
字符串必须以ws
或者wss
(加密通信时)文字作为开头。
使用WebSocket
对象的send
方法对服务器发送数据,只能发送文本数据。
代码:
webSocket.send("data");
通过获取onmessage
事件句柄来接收服务器传过来的数据:
代码:
webSocket.onmessage = function(event){
var data = event.data;
}
通过获取onopen
事件句柄来监听socket
的打开事件:
代码:
webSocket.onopen = function(event){
// 开始通信时的处理
}
通过获取onclose
事件句柄来监听socket
的关闭事件:
代码:
webSocket.onclose = function(event) {
// 开始通信时的处理
};
通过close
方法来关闭socket
,切断通信连接。
webSocket.close()


一个典型的 Websocket 握手请求
客户端请求

服务器回应

小记
Service Worker
和cacheStorage
缓存及离线开发缓存和离线开发
通俗易懂的方式介绍
Service Worker
了解 JS 中的全局对象
window.self
和全局作用域self
了解
Cache
和CacheStorage
借助
Service Worker
和cacheStorage
离线开发的固定套路和
PWA
技术的关系离线
web
应用程序,当客户端本地与web
应用程序的服务器没有建立连接时,也是能正常在客户端本地使用该web
应用程序进行有关操作的。
参阅地址
https://developer.mozilla.org/zh-CN/
https://www.ruanyifeng.com/blog/2017/05/websocket.html
❤️关注+点赞+收藏+评论+转发❤️,原创不易,鼓励笔者创作更好的文章
点赞、收藏和评论
我是Jeskson
(达达前端),感谢各位人才的:点赞、收藏和评论,我们下期见!(如本文内容有地方讲解有误,欢迎指出☞谢谢,一起学习了)
我们下期见!
文章持续更新,可以微信搜一搜「 程序员哆啦 A 梦 」第一时间阅读,回复【资料】有我准备的一线大厂资料,本文 http://www.dadaqianduan.cn/#/ 已经收录
github
收录,欢迎Star
:https://github.com/webVueBlog/WebFamily
版权声明: 本文为 InfoQ 作者【魔王哪吒】的原创文章。
原文链接:【http://xie.infoq.cn/article/b038e82bd5265cd5166c5589a】。未经作者许可,禁止转载。
评论