Html5学习系列
<h2 id="h2_1">Html5学习系列</h2><p> </p>
<p> </p>
<h3 id="h3_2">HTML5 规定了一种通过 video 元素来包含视频的标准方法</h3>
<p> </p>
<p>Ogg = 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件</p>
<p> </p>
<p>MPEG4 = 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件</p>
<p> </p>
<p>WebM = 带有 VP8 视频编码和 Vorbis 音频编码的 WebM 文件</p>
<p> </p>
<h3 id="h3_3">如需在 HTML5 中显示视频,您所有需要的是:</h3>
<p><video src="movie.ogg" controls="controls"></p>
<p></video></p>
<p>control 属性供添加播放、暂停和音量控件。</p>
<p> </p>
<p> </p>
<h3 id="h3_4">HTML5 规定了一种通过 audio 元素来包含音频的标准方法。</h3>
<p> </p>
<p>audio 元素能够播放声音文件或者音频流。</p>
<p> </p>
<p><audio> 与 </audio> 之间插入的内容是供不支持 audio 元素的浏览器显示的:</p>
<p> </p>
<p>实例</p>
<p> </p>
<p><audio src="song.ogg" controls="controls"></p>
<p>Your browser does not support the audio tag.</p>
<p></audio></p>
<p> </p>
<p> </p>
<h2 id="h2_5">HTML5 拖放实例</h2>
<p> </p>
<p> </p>
<p>设置元素为可拖放</p>
<p> </p>
<h4 id="h4_6">首先,为了使元素可拖动,把 draggable 属性设置为 true :</h4>
<p> </p>
<p><img draggable="true" /></p>
<p> </p>
<p> </p>
<p>拖动什么 - ondragstart 和 setData()</p>
<p> </p>
<h4 id="h4_7">然后,规定当元素被拖动时,会发生什么。</h4>
<p> </p>
<p>在上面的例子中,ondragstart 属性调用了一个函数,drag(event),它规定了被拖动的数据。</p>
<p> </p>
<p>dataTransfer.setData() 方法设置被拖数据的数据类型和值:</p>
<p> </p>
<p>function drag(ev)</p>
<p>{</p>
<p>ev.dataTransfer.setData("Text",ev.target.id);</p>
<p>}</p>
<p> </p>
<p>在这个例子中,数据类型是 "Text",值是可拖动元素的 id ("drag1")。</p>
<p> </p>
<p> </p>
<p> </p>
<h4 id="h4_8">放到何处 - ondragover</h4>
<p> </p>
<p>ondragover 事件规定在何处放置被拖动的数据。</p>
<p> </p>
<p>默认地,无法将数据/元素放置到其他元素中。如果需要设置允许放置,我们必须阻止对元素的默认处理方式。</p>
<p> </p>
<p>这要通过调用 ondragover 事件的 event.preventDefault() 方法:</p>
<p> </p>
<p>event.preventDefault()</p>
<p> </p>
<p> </p>
<p> </p>
<h4 id="h4_9">进行放置 - ondrop</h4>
<p> </p>
<p>当放置被拖数据时,会发生 drop 事件。</p>
<p> </p>
<p>在上面的例子中,ondrop 属性调用了一个函数,drop(event):</p>
<p> </p>
<p>function drop(ev)</p>
<p>{</p>
<p>ev.preventDefault();</p>
<p>var data=ev.dataTransfer.getData("Text");</p>
<p>ev.target.appendChild(document.getElementById(data));</p>
<p>}</p>
<p> </p>
<p>代码解释:</p>
<p> </p>
<p> 调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以链接形式打开)</p>
<p> 通过 dataTransfer.getData("Text") 方法获得被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。</p>
<p> 被拖数据是被拖元素的 id ("drag1")</p>
<p> 把被拖元素追加到放置元素(目标元素)中</p>
<p> </p>
<p> </p>
<p> </p>
<h2 id="h2_10">HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像</h2>
<p> </p>
<h3 id="h3_11">创建 Canvas 元素</h3>
<p>向 HTML5 页面添加 canvas 元素。</p>
<p>规定元素的 id、宽度和高度:</p>
<p><canvas id="myCanvas" width="200" height="100"></canvas></p>
<h4 id="h4_12">通过 JavaScript 来绘制</h4>
<p>canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成:</p>
<p><script type="text/javascript"></p>
<p>var c=document.getElementById("myCanvas");</p>
<p>var cxt=c.getContext("2d");</p>
<p>cxt.fillStyle="#FF0000";</p>
<p>cxt.fillRect(0,0,150,75);</p>
<p></script></p>
<p> </p>
<p> </p>
<p> </p>
<p><script type="text/javascript"></p>
<p> </p>
<p>var c=document.getElementById("myCanvas");</p>
<p>var cxt=c.getContext("2d");</p>
<p>cxt.moveTo(10,10);</p>
<p>cxt.lineTo(150,50);</p>
<p>cxt.lineTo(10,50);</p>
<p>cxt.stroke();</p>
<p> </p>
<p></script></p>
<p> </p>
<p> </p>
<p><script type="text/javascript"></p>
<p> </p>
<p>var c=document.getElementById("myCanvas");</p>
<p>var cxt=c.getContext("2d");</p>
<p>cxt.fillStyle="#FF0000";</p>
<p>cxt.beginPath();</p>
<p>cxt.arc(70,18,15,0,Math.PI*2,true);</p>
<p>cxt.closePath();</p>
<p>cxt.fill();</p>
<p> </p>
<p></script></p>
<p> </p>
<p>把图片放到画布上</p>
<p><script type="text/javascript"></p>
<p> </p>
<p>var c=document.getElementById("myCanvas");</p>
<p>var cxt=c.getContext("2d");</p>
<p>var img=new Image()</p>
<p>img.src="flower.png"</p>
<p>cxt.drawImage(img,0,0);</p>
<p> </p>
<p></script></p>
<p> </p>
<p> </p>
<p> </p>
<h2 id="h2_13">什么是SVG?</h2>
<p> </p>
<p> SVG 指可伸缩矢量图形 (Scalable Vector Graphics)</p>
<p> SVG 用于定义用于网络的基于矢量的图形</p>
<p> SVG 使用 XML 格式定义图形</p>
<p> SVG 图像在放大或改变尺寸的情况下其图形质量不会有损失</p>
<p> SVG 是万维网联盟的标准</p>
<p> </p>
<p> </p>
<h3 id="h3_14">SVG 的优势</h3>
<p> </p>
<p>与其他图像格式相比(比如 JPEG 和 GIF),使用 SVG 的优势在于:</p>
<p> </p>
<p> SVG 图像可通过文本编辑器来创建和修改</p>
<p> SVG 图像可被搜索、索引、脚本化或压缩</p>
<p> SVG 是可伸缩的</p>
<p> SVG 图像可在任何的分辨率下被高质量地打印</p>
<p> SVG 可在图像质量不下降的情况下被放大</p>
<h4 id="h4_15">把 SVG 直接嵌入 HTML 页面</h4>
<p>在 HTML5 中,您能够将 SVG 元素直接嵌入 HTML 页面中:</p>
<p>实例</p>
<p><!DOCTYPE html></p>
<p><html></p>
<p><body></p>
<p> </p>
<p><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190"></p>
<p> <polygon points="100,10 40,180 190,60 10,60 160,180"</p>
<p> style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;" /></p>
<p></svg></p>
<p> </p>
<p></body></p>
<p></html></p>
<p> </p>
<p> </p>
<h4 id="h4_16">Canvas 与 SVG 的比较</h4>
<p>下表列出了 canvas 与 SVG 之间的一些不同之处。</p>
<p>Canvas</p>
<ul>
<li>依赖分辨率</li>
<li>不支持事件处理器</li>
<li>弱的文本渲染能力</li>
<li>能够以 .png 或 .jpg 格式保存结果图像</li>
<li>最适合图像密集型的游戏,其中的许多对象会被频繁重绘</li>
</ul>
<p>SVG</p>
<ul>
<li>不依赖分辨率</li>
<li>支持事件处理器</li>
<li>最适合带有大型渲染区域的应用程序(比如谷歌地图)</li>
<li>复杂度高会减慢渲染速度(任何过度使用 DOM 的应用都不快)</li>
<li>不适合游戏应用</li>
</ul>
<p> </p>
<h3 id="h3_17">HTML5 - 使用地理定位</h3>
<p> </p>
<p>请使用 getCurrentPosition() 方法来获得用户的位置。</p>
<p> </p>
<p>下例是一个简单的地理定位实例,可返回用户位置的经度和纬度。</p>
<p> </p>
<p> </p>
<p><!DOCTYPE html></p>
<p><html></p>
<p><body></p>
<p><p id="demo">点击这个按钮,获得您的坐标:</p></p>
<p><button onclick="getLocation()">试一下</button></p>
<p><script></p>
<p>var x=document.getElementById("demo");</p>
<p>function getLocation()</p>
<p> {</p>
<p> if (navigator.geolocation)</p>
<p> {</p>
<p> navigator.geolocation.getCurrentPosition(showPosition,showError);</p>
<p> }</p>
<p> else{x.innerHTML="Geolocation is not supported by this browser.";}</p>
<p> }</p>
<p>function showPosition(position)</p>
<p> {</p>
<p> x.innerHTML="Latitude: " + position.coords.latitude +</p>
<p> "<br />Longitude: " + position.coords.longitude; </p>
<p> }</p>
<p>function showError(error)</p>
<p> {</p>
<p> switch(error.code)</p>
<p> {</p>
<p> case error.PERMISSION_DENIED:</p>
<p> x.innerHTML="User denied the request for Geolocation."</p>
<p> break;</p>
<p> case error.POSITION_UNAVAILABLE:</p>
<p> x.innerHTML="Location information is unavailable."</p>
<p> break;</p>
<p> case error.TIMEOUT:</p>
<p> x.innerHTML="The request to get user location timed out."</p>
<p> break;</p>
<p> case error.UNKNOWN_ERROR:</p>
<p> x.innerHTML="An unknown error occurred."</p>
<p> break;</p>
<p> }</p>
<p> }</p>
<p></script></p>
<p></body></p>
<p></html></p>
<p> </p>
<h2 id="h2_18">在客户端存储数据</h2>
<p> </p>
<p>HTML5 提供了两种在客户端存储数据的新方法:</p>
<p> </p>
<p> localStorage - 没有时间限制的数据存储</p>
<p> sessionStorage - 针对一个 session 的数据存储</p>
<p> </p>
<p>之前,这些都是由 cookie 完成的。但是 cookie 不适合大量数据的存储,因为它们由每个对服务器的请求来传递,这使得 cookie 速度很慢而且效率也不高。</p>
<p> </p>
<p> </p>
<p> </p>
<h3 id="h3_19">localStorage 方法</h3>
<p> </p>
<p>localStorage 方法存储的数据没有时间限制。第二天、第二周或下一年之后,数据依然可用。</p>
<p> </p>
<p>如何创建和访问 localStorage:</p>
<p>实例</p>
<p> </p>
<p><script type="text/javascript"></p>
<p>localStorage.lastname="Smith";</p>
<p>document.write(localStorage.lastname);</p>
<p></script></p>
<p> </p>
<p> </p>
<p> </p>
<p>下面的例子对用户访问页面的次数进行计数:</p>
<p>实例</p>
<p><script type="text/javascript"></p>
<p>if (localStorage.pagecount)</p>
<p> {</p>
<p> localStorage.pagecount=Number(localStorage.pagecount) +1;</p>
<p> }</p>
<p>else</p>
<p> {</p>
<p> localStorage.pagecount=1;</p>
<p> }</p>
<p>document.write("Visits "+ localStorage.pagecount + " time(s).");</p>
<p></script></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h3 id="h3_20">sessionStorage 方法</h3>
<p>sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后,数据会被删除。</p>
<p>如何创建并访问一个 sessionStorage:</p>
<p>实例</p>
<p><script type="text/javascript"></p>
<p>sessionStorage.lastname="Smith";</p>
<p>document.write(sessionStorage.lastname);</p>
<p></script></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h2 id="h2_21">使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本。</h2>
<p> </p>
<p> </p>
<h4 id="h4_22">什么是应用程序缓存(Application Cache)?</h4>
<p>HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。</p>
<p>应用程序缓存为应用带来三个优势:</p>
<ul>
<li>离线浏览 - 用户可在应用离线时使用它们</li>
<li>速度 - 已缓存资源加载得更快</li>
<li>减少服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源。</li>
</ul>
<p> </p>
<p> </p>
<p> </p>
<h4 id="h4_23">Cache Manifest 基础</h4>
<p>如需启用应用程序缓存,请在文档的 <html> 标签中包含 manifest 属性:</p>
<p><!DOCTYPE HTML></p>
<p><html manifest="demo.appcache"></p>
<p>...</p>
<p></html></p>
<p>每个指定了 manifest 的页面在用户对其访问时都会被缓存。如果未指定 manifest 属性,则页面不会被缓存(除非在 manifest 文件中直接指定了该页面)。</p>
<p>manifest 文件的建议的文件扩展名是:".appcache"。</p>
<p>请注意,manifest 文件需要配置<em>正确的 MIME-type</em>,即 "text/cache-manifest"。必须在 web 服务器上进行配置。</p>
<p> </p>
<p> </p>
<p> </p>
<h4 id="h4_24">web worker 是运行在后台的 JavaScript,不会影响页面的性能。</h4>
<h5 id="h5_25">什么是 Web Worker?</h5>
<p> </p>
<p>当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。</p>
<p> </p>
<p>web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。</p>
<p>浏览器支持</p>
<p> </p>
<p>所有主流浏览器均支持 web worker,除了 Internet Explorer。</p>
<p>HTML5 Web Workers 实例</p>
<p> </p>
<p>下面的例子创建了一个简单的 web worker,在后台计数:</p>
<p> </p>
<p> </p>
<p>在创建 web worker 之前,请检测用户的浏览器是否支持它:</p>
<p> </p>
<p>if(typeof(Worker)!=="undefined")</p>
<p> {</p>
<p> // Yes! Web worker support!</p>
<p> // Some code.....</p>
<p> }</p>
<p>else</p>
<p> {</p>
<p> // Sorry! No Web Worker support..</p>
<p> }</p>
<p> </p>
<p>创建 web worker 文件</p>
<p> </p>
<p>现在,让我们在一个外部 JavaScript 中创建我们的 web worker。</p>
<p> </p>
<p>在这里,我们创建了计数脚本。该脚本存储于 "demo_workers.js" 文件中:</p>
<p> </p>
<p>var i=0;</p>
<p> </p>
<p>function timedCount()</p>
<p>{</p>
<p>i=i+1;</p>
<p>postMessage(i);</p>
<p>setTimeout("timedCount()",500);</p>
<p>}</p>
<p> </p>
<p>timedCount();</p>
<p> </p>
<p>以上代码中重要的部分是 postMessage() 方法 - 它用于向 HTML 页面传回一段消息。</p>
<p> </p>
<p>注释:web worker 通常不用于如此简单的脚本,而是用于更耗费 CPU 资源的任务。</p>
<p> </p>
<p> </p>
<p>创建 Web Worker 对象</p>
<p>我们已经有了 web worker 文件,现在我们需要从 HTML 页面调用它。</p>
<p>下面的代码检测是否存在 worker,如果不存在,- 它会创建一个新的 web worker 对象,然后运行 "demo_workers.js" 中的代码:</p>
<p>if(typeof(w)=="undefined")</p>
<p> {</p>
<p> w=new Worker("demo_workers.js");</p>
<p> }</p>
<p> </p>
<p>然后我们就可以从 web worker 发生和接收消息了。</p>
<p>向 web worker 添加一个 "onmessage" 事件监听器:</p>
<p>w.onmessage=function(event){</p>
<p>document.getElementById("result").innerHTML=event.data;</p>
<p>};</p>
<p> </p>
<p>当 web worker 传递消息时,会执行事件监听器中的代码。event.data 中存有来自 event.data 的数据。</p>
<p> </p>
<h4 id="h4_26">完整的 Web Worker 实例代码</h4>
<p>我们已经看到了 .js 文件中的 Worker 代码。下面是 HTML 页面的代码:</p>
<p>实例</p>
<p><!DOCTYPE html></p>
<p><html></p>
<p><body></p>
<p> </p>
<p><p>Count numbers: <output id="result"></output></p></p>
<p><button onclick="startWorker()">Start Worker</button></p>
<p><button onclick="stopWorker()">Stop Worker</button></p>
<p><br /><br /></p>
<p> </p>
<p><script></p>
<p>var w;</p>
<p> </p>
<p>function startWorker()</p>
<p>{</p>
<p>if(typeof(Worker)!=="undefined")</p>
<p>{</p>
<p> if(typeof(w)=="undefined")</p>
<p> {</p>
<p> w=new Worker("demo_workers.js");</p>
<p> }</p>
<p> w.onmessage = function (event) {</p>
<p> document.getElementById("result").innerHTML=event.data;</p>
<p> };</p>
<p>}</p>
<p>else</p>
<p>{</p>
<p>document.getElementById("result").innerHTML="Sorry, your browser</p>
<p> does not support Web Workers...";</p>
<p>}</p>
<p>}</p>
<p> </p>
<p>function stopWorker()</p>
<p>{</p>
<p>w.terminate();</p>
<p>}</p>
<p></script></p>
<p> </p>
<p></body></p>
<p></html></p>
<p> </p>
<p> </p>
<h2 id="h2_27">HTML5 服务器发送事件(server-sent event)允许网页获得来自服务器的更新。</h2>
<p> </p>
<p>Server-Sent 事件 - 单向消息传递</p>
<p>Server-Sent 事件指的是网页自动获取来自服务器的更新。</p>
<p>以前也可能做到这一点,前提是网页不得不询问是否有可用的更新。通过服务器发送事件,更新能够自动到达。</p>
<p> </p>
<p> </p>
<p> </p>
<p>接收 Server-Sent 事件通知</p>
<p> </p>
<p>EventSource 对象用于接收服务器发送事件通知:</p>
<p>实例</p>
<p> </p>
<p>var source=new EventSource("demo_sse.php");</p>
<p>source.onmessage=function(event)</p>
<p> {</p>
<p> document.getElementById("result").innerHTML+=event.data + "<br />";</p>
<p> };</p>
<p> </p>
<p> </p>
<p>服务器端事件流的语法是非常简单的。把 "Content-Type" 报头设置为 "text/event-stream"。现在,您可以开始发送事件流了。</p>
<p>PHP 代码 (demo_sse.php):</p>
<p><?php</p>
<p>header('Content-Type: text/event-stream');</p>
<p>header('Cache-Control: no-cache');</p>
<p> </p>
<p>$time = date('r');</p>
<p>echo "data: The server time is: {$time}\n\n";</p>
<p>flush();</p>
<p>?></p>
<p>ASP 代码 (VB) (demo_sse.asp):</p>
<p><%</p>
<p>Response.ContentType="text/event-stream"</p>
<p>Response.Expires=-1</p>
<p>Response.Write("data: " & now())</p>
<p>Response.Flush()</p>
<p>%></p>
<p>代码解释:</p>
<ul>
<li>把报头 "Content-Type" 设置为 "text/event-stream"</li>
<li>规定不对页面进行缓存</li>
<li>输出发送日期(始终以 "data: " 开头)</li>
<li>向网页刷新输出数据</li>
</ul>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h2 id="h2_28">HTML5 新的 Input 类型</h2>
<p>HTML5 拥有多个新的表单输入类型。这些新特性提供了更好的输入控制和验证。</p>
<p>本章全面介绍这些新的输入类型:</p>
<ul>
<li>email</li>
<li>url</li>
<li>number</li>
<li>range</li>
<li>Date pickers (date, month, week, time, datetime, datetime-local)</li>
<li>search</li>
<li>color</li>
</ul>
<p> </p>
<h2 id="h2_29">HTML5 的新的表单元素:</h2>
<p>HTML5 拥有若干涉及表单的元素和属性。</p>
<p>本章介绍以下新的表单元素:</p>
<ul>
<li>datalist</li>
<li>keygen</li>
<li>output</li>
</ul>
<p> </p>
<p>----来自w3cschool</p><br><br>
来源:https://www.cnblogs.com/zmlljx/p/12215085.html
頁:
[1]