金英 發表於 2019-7-24 17:47:00

HTML5 API

<p class="22"><span style="font-family: MingLiU">第</span> <strong>14 </strong><span style="font-family: MingLiU">章</span> <strong>HTML5 API</strong></p>
<p class="17">HTML5是用于创建网页的超文本标记语言的最新版本。目前最新的版本号为5.1,于2016年11<span style="font-family: MingLiU">月</span> <span style="font-family: MingLiU">成为了</span>W3C的推荐标准。HTML5<span style="font-family: MingLiU">给规范添加了大量的新功能。还超越了实际的标记语言,带来</span> <span style="font-family: MingLiU">了很多相关的技术,比如</span>CSS和JavaScript。我们在第10<span style="font-family: MingLiU">章介绍表单验证的时候,已经看到了一</span> <span style="font-family: MingLiU">些新的表单控件以及校验表单的</span>API。在本章,我们将继续来看一下H TML5<span style="font-family: MingLiU">中有哪些其他的</span> API。</p>
<p class="17">本章我们将学习如下内容:</p>
<ul>
<li>Web Storage存储数据</li>
<li>Geolocation API获取位置信息</li>
<li>Web Worker</li>
</ul>
<p class="17">•插入音频和视频</p>
<p class="17">•使用canvas进行绘图</p>
<p class="20">・HTML5中的拖放</p>
<ul>
<li>Notification API创建用户通知</li>
</ul>
<p class="21"><strong>14-1 </strong><strong>Web Storage</strong></p>
<p class="17">Web Storage(Web存储)提供了一种方式,可以让Web<span style="font-family: MingLiU">页面实现在客户端浏览器中意键值对的形式</span> <span style="font-family: MingLiU">在本地保存数据。在了解</span>H TML5的Web<span style="font-family: MingLiU">存储之前,我们先来看一下前面我们所介绍过的使用</span> Cookies存储机制的优缺点。</p>
<p class="19"><strong>14-1-1 Cookie</strong>存储机制的优缺点</p>
<p class="17">在讲解BOM一章时,我们有介绍过Cookie。Cookie是HTML4<span style="font-family: MingLiU">中在客户端存储简单用户信息的一</span> <span style="font-family: MingLiU">种方式,它使用文本来存储信息,当有应用程序使用</span>Cookie时,服务器端就会发送Cookie<span style="font-family: MingLiU">到客户</span> <span style="font-family: MingLiU">端,客户端浏览器将会保存该</span>Cookie信息。下一次页面请求时,客户端浏览器就会把Cookie<span style="font-family: MingLiU">发送</span> <span style="font-family: MingLiU">到服务器。</span>Cookie最典型的应用是用来保存用户信息,用户设置和密码记忆等。</p>
<p class="17">使用Cookie有其优点,也有其缺陷,其优点主要表现在以下几个方面。</p>
<p class="17">・简单易用</p>
<p class="17">・浏览器负责发送数据</p>
<p class="17">・浏览器自动管理不同站点的Cookie。</p>
<p class="17">但是经过长期的使用,Cookie的缺点也渐渐暴露了出来,主要有以下几点。</p>
<p class="17">・因为使用的是简单的文本存储数据,所以Cookie的安全性很差。Cookie<span style="font-family: MingLiU">保存在客户端浏览</span> <span style="font-family: MingLiU">器,很容易被黑客窃取。</span></p>
<p class="17" align="justify">・Cookie中存储的数据容量有限,其上限为4KB。</p>
<p class="17" align="justify">•存储Cookie的数量有限,多数浏览器的上限为30或50个。</p>
<p class="17" align="justify">・如果浏览器的安全配置为最高级别,那么Cookie则会失效。</p>
<ul>
<li>Cookie不适合大量数据的存储,因为Cookie<span style="font-family: MingLiU">会由每个对服务器的请求来传递,从而造成</span> Cookie速度缓慢效率低下。</li>
</ul>
<p class="19"><strong>14-1-2 </strong><span style="font-family: MingLiU">为什么要用</span> <strong>Web Storage</strong></p>
<p class="17">HTML5的Web Storage提供了两种在客户端存储数据的方法,</p>
<p class="20"><span style="font-family: MingLiU">即</span> localStorage <span style="font-family: MingLiU">和</span> sessionStorage 。</p>
<p class="18"><strong>localStorage</strong></p>
<p class="17">localstorage<span style="font-family: MingLiU">是一种没有时间限制的数据存储方式,可以将数据保存在客户端的硬盘或其他存储</span> <span style="font-family: MingLiU">器,存储时间可以是一天,两天,几周或几年。浏览器的关闭并不意味着数据也会随之消失。当</span> <span style="font-family: MingLiU">再次打开浏览器时,我们依然可以访问这些数据。</span>localStorage<span style="font-family: MingLiU">用于持久化的本地存储,除非主</span> <span style="font-family: MingLiU">动删除数据,否则数据是永远不会过期的。</span></p>
<p class="16"><strong>sessionStorage</strong></p>
<p class="17">sessionStorage指的是针对一个session的数据存储,即将数据保存在session对象中。Web<span style="font-family: MingLiU">中的</span> session<span style="font-family: MingLiU">指的是用户在浏览某个网站时,从进入网站到关闭浏览器所经过的这段时间,可以称为</span> <span style="font-family: MingLiU">用户和浏览器进行交互的</span>"会话时间"。session<span style="font-family: MingLiU">对象用来保存这个时间段内所有要保存的数据。当</span> <span style="font-family: MingLiU">用户关闭浏览器后,这些数据会被删除。</span></p>
<p class="17">sessionStorage用于本地存储一个会话(session)<span style="font-family: MingLiU">中的数据,这些数据只有在同一个会话中的页面</span> <span style="font-family: MingLiU">才能访问,并且当会话结束后数据也随之销毁。因此</span>sessionStorage<span style="font-family: MingLiU">不是一种持久化的本地存</span> <span style="font-family: MingLiU">储,仅仅是会话级别的存储。</span></p>
<p class="17">从上面的介绍我们可以看出,localStorage可以永久保存数据,而sessionStorage<span style="font-family: MingLiU">只能暂时保存</span> <span style="font-family: MingLiU">数据,这是两者之间的重要区别,在具体使用时应该注意。</span></p>
<p class="17">Web Storage存储机制比传统的Cookie更加强大,弥补了Cookie<span style="font-family: MingLiU">诸多缺点,主要在以下几个方面</span> <span style="font-family: MingLiU">做了加强:</span></p>
<ul>
<li>Web Storage提供了易于使用的API接口,只需要设置键值对即可使用,简单方便</li>
</ul>
<p class="17">・在存储容量方面可以根据用户分配的磁盘配额进行存储,能够在每个用户域存储5MB<span style="font-family: MingLiU">〜</span> 10MB的内容。用户不仅可以存储session,<span style="font-family: MingLiU">还可以存储许多信息,如设置偏好,本地化的数</span> <span style="font-family: MingLiU">据和离线数据等。</span></p>
<ul>
<li>Web Storage还提供了使用J avaScript编程的接口,开发者可以使用J avaScript客户端脚本实</li>
</ul>
<p class="17">现许多以前只能在服务器端才能完成的工作。</p>
<p class="19"><strong>14-1-3 </strong><span style="font-family: MingLiU">使用</span> <strong>Web Storage</strong></p>
<p class="17">如果浏览器支持Web Storage API,那么window对象中就会有localstorage和sessionstorage<span style="font-family: MingLiU">这</span> <span style="font-family: MingLiU">个属性。这个属性是一个原生对象,带有很多用于存储数据的属性和方法。信息是以键值对的形</span> <span style="font-family: MingLiU">式存储,值只能是字符串。</span></p>
<p class="17">存储示例:我们可以通过setItem()方法来存储一个值,然后通过getItem()方法来获取值</p>
<p class="20">在1.html里面设置localstorage的值</p>
<p class="20">&lt;body&gt; &lt;script&gt; localStorage.setItem("name","xiejie");</p>
<p class="20">console.log("信息已保存!");</p>
<p class="20">&lt;/script&gt;</p>
<p class="20">&lt;/body&gt;</p>
<p class="17">接下来在2.htm l里面来获取已经设置了的值</p>
<p class="20">&lt;body&gt; &lt;script&gt; let name = localStorage.getItem("name");</p>
<p class="20">console.log(' <span style="font-family: MingLiU">姓名为</span> ${name}');//<span style="font-family: MingLiU">姓名为</span> xiejie</p>
<p class="20">&lt;/script&gt;</p>
<p class="20">&lt;/body&gt;</p>
<p class="17"><span style="font-family: MingLiU">这里,我们存储的值是存放于本地的,所以没有时间的限制,即使我们关闭浏览器,设置了的值</span> <span style="font-family: MingLiU">也依然存在。除了上面使用</span>getItem()和setItem()<span style="font-family: MingLiU">来存取数据以外,我们还可以直接进行如</span> <span style="font-family: MingLiU">下的存值和取值操作,就好像是给一个属性赋值一样,如下:</span></p>
<p class="20">在1.html里面设置localstorage的值</p>
<p class="20">&lt;body&gt; &lt;script&gt; localStorage.setItem("name","xiejie");</p>
<p class="20">localStorage.age = 18; console.log("信息已保存!");</p>
<p class="20">&lt;/script&gt;</p>
<p class="20">&lt;/body&gt;</p>
<p class="17">接下来在2.htm I里面来获取已经设置了的值</p>
<p class="20">&lt;body&gt;</p>
<p class="20">&lt;script&gt;</p>
<p class="20">let name = localStorage.getItem("name");</p>
<p class="20">let age = localStorage.age;</p>
<p class="20">console.log(' <span style="font-family: MingLiU">姓名为</span> ${name}<span style="font-family: MingLiU">,年龄为</span> ${age}'); //姓名为xiejie,年龄为18</p>
<p class="20">&lt;/script&gt;</p>
<p class="20">&lt;/body&gt;</p>
<p class="17">如果要删除本地存储中的一个条目,可以使用r emoveItem()方法或者直接使用delete<span style="font-family: MingLiU">运算</span> <span style="font-family: MingLiU">符,如下:</span></p>
<p class="20">localStorage.removeItem("name");</p>
<p class="17"><em>//或者</em></p>
<p class="20"><strong>delete </strong>localStorage.name</p>
<p class="17">如果要彻底删除本地存储中所有的东西,可以使用clea r()方法,如下:</p>
<p class="20">localStorage.clear()</p>
<p class="19"><strong>14-1-4 storage </strong>事件</p>
<p class="17">每次将一个值存储到本地存储时,就会触发一个storage<span style="font-family: MingLiU">事件。由事件监听器发送给回调函数的</span> <span style="font-family: MingLiU">事件对象有几个自动填充的属性如下:</span></p>
<p class="17">・key:告诉我们被修改的条目的键</p>
<ul>
<li>newValue:告诉我们被修改后的新值</li>
<li>oldValue:告诉我们修改前的值</li>
<li>storageArea:告诉我们是本地存储还是会话存储</li>
</ul>
<p class="17">・url:被改变键的文档地址</p>
<p class="17"><span style="font-family: MingLiU">需要注意的是,这个事件只在同一域下的任何窗口或者标签上触发,并且只在被存储的条目改变</span> <span style="font-family: MingLiU">时触发。</span></p>
<p class="17">示例如下:这里我们需要打开服务器进行演示,本地文件无法触发storage事件</p>
<ol>
<li>html代码如下:在该页面下我们设置了两个localstorage并存储了两个值</li>
</ol>
<p class="20">&lt;!DOCTYPE html&gt;</p>
<p class="20">&lt;html lang="en"&gt;</p>
<p class="20">&lt;head&gt;</p>
<p class="20">&lt;meta charset="UTF-8"&gt; &lt;title&gt;Document&lt;/title&gt;</p>
<p class="20">&lt;/head&gt;</p>
<p class="20">&lt;body&gt;</p>
<p class="20">&lt;script&gt; localStorage.name = "xiejie"; localStorage.age = 20;</p>
<p class="20">console.log(“信息已经设置!");</p>
<p class="20">&lt;/script&gt;</p>
<p class="20">&lt;/body&gt;</p>
<p class="20">&lt;/html&gt;</p>
<ol>
<li>html代码如下:在该页面中我们安装了一个storage<span style="font-family: MingLiU">的事件监听器,安装之后只要是同一域下面</span> <span style="font-family: MingLiU">的其他</span>storage值发生改变,该页面下面的storage事件就会被触发</li>
</ol>
<p class="20">&lt;!DOCTYPE html&gt;</p>
<p class="20">&lt;html lang="en"&gt;</p>
<p class="20">&lt;head&gt;</p>
<p class="20">&lt;meta charset="UTF-8"&gt; &lt;title&gt;Document&lt;/title&gt;</p>
<p class="20">&lt;/head&gt;</p>
<p class="20">&lt;body&gt;</p>
<p class="20">&lt;script&gt;</p>
<p class="20">let name = localStorage.getItem("name");</p>
<p class="20">let age = localStorage.age; console.log(' <span style="font-family: MingLiU">姓名为</span> ${name}<span style="font-family: MingLiU">,年龄为</span> ${age}'); window.addEventListener("storage",(e)=&gt;{ console.log('${e.key} <span style="font-family: MingLiU">从</span>${e.oldValue}<span style="font-family: MingLiU">修改为</span> ${e.newValue}'); console.log(' <span style="font-family: MingLiU">这是一个</span> ${e.sto rageA rea}存储'); console.log(' <span style="font-family: MingLiU">被改变的</span> url<span style="font-family: MingLiU">为</span> ${e.u rl}');</p>
<p class="20">},true);</p>
<p class="20">&lt;/script&gt;</p>
<p class="20">&lt;/body&gt;</p>
<p class="20">&lt;/html&gt;</p>
<p class="20">接下来我们来改变1.html里面localStorage.name的值</p>
<p class="20">localSto rage.name ="谢杰";</p>
<p class="17">之后我们就会看到安装在2.html页面里面的storage<span style="font-family: MingLiU">事件就会被触发,显示出如下效果</span>:<br clear="all">name从xiej ie修改为谢杰</p>
<p class="23">这是一个<span style="font-family: Arial">[</span>object Storage]存储</p>
<p class="23"><span style="font-family: MingLiU">被改变的</span> u r I <span style="font-family: MingLiU">为</span> <span style="text-decoration: underline">httD</span><span style="text-decoration: underline"><span style="font-family: 宋体">:</span></span><span style="text-decoration: underline">&nbsp;//localhost/l, html</span></p>
<p class="17" align="justify">最后,需要说明一下的就是虽然Web Storage<span style="font-family: MingLiU">只能存储字符串看起来限制很大,但是通过使用</span> JSON,我们可以在本地存储中存储任何的JSON对象,如下:</p>
<p class="20"><strong>let </strong>xiejie = {"name":"xiejie","age":18}; localStorage.setItem("info",JSON.stringify(xiejie));</p>
<p class="17" align="justify">这段代码会将xiejie这个对象存储为以info作为键的一个JSON<span style="font-family: MingLiU">字符串,当我们要将其取出来使用</span> <span style="font-family: MingLiU">的时候,只需要再使用</span>JSON.pa rse方法将其转换回JSO N对象即可</p>
<p class="20">xiejie = JSON.parse(localStorage.info);</p><br><br>
来源:https://www.cnblogs.com/jrzqdlgdx/p/11239709.html
頁: [1]
查看完整版本: HTML5 API