1、HTML5新特性javascript
一、视频php
在HTML5以前,网络上的视频大多都是使用Flash插件进行播放的,保险如今也仍然有不少。HTML5规定了一种经过video元素包含视频的标注方法。css
视频格式的支持:html
格式 | IE | Firefox | Opera | Chrome | Safari |
---|---|---|---|---|---|
Ogg | No | 3.5+ | 10.5+ | 5.0+ | No |
MPEG 4 | 9.0+ | No | No | 5.0+ | 3.0+ |
WebM | No | 4.0+ | 10.6+ | 6.0+ | No |
Ogg = 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件html5
MPEG4 = 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件java
WebM = 带有 VP8 视频编码和 Vorbis 音频编码的 WebM 文件git
video 元素容许多个 source 元素。source 元素能够连接不一样的视频文件。浏览器将使用第一个可识别的格式,示例:web
<video width="320" height="240" controls="controls"> <source src="movie.ogg" type="video/ogg"> <source src="movie.mp4" type="video/mp4"> Your browser does not support the video tag. </video>
属性 | 值 | 描述 |
---|---|---|
autoplay | autoplay | 若是出现该属性,则视频在就绪后立刻播放。 |
controls | controls | 若是出现该属性,则向用户显示控件,好比播放按钮。 |
height | pixels | 设置视频播放器的高度。 |
loop | loop | 若是出现该属性,则当媒介文件完成播放后再次开始播放。 |
preload | preload | 若是出现该属性,则视频在页面加载时进行加载,并预备播放。若是使用 "autoplay",则忽略该属性。 |
src | url | 要播放的视频的 URL。 |
width | pixels | 设置视频播放器的宽度。 |
关于视频的javascript控制与事件。大致上有play(),pause(),load()三种方法,事件和属性详细参见HTML5 视频/DOM。canvas
二、音频浏览器
和视频相同,以前也没有网页直接播放音频的标准,都是使用的插件。如今能够直接使用audio标签来加载音频文件了。
音频格式的支持:
IE 9 | Firefox 3.5 | Opera 10.5 | Chrome 3.0 | Safari 3.0 | |
---|---|---|---|---|---|
Ogg Vorbis | √ | √ | √ | ||
MP3 | √ | √ | √ | ||
Wav | √ | √ | √ |
audio 元素容许多个 source 元素。source 元素能够连接不一样的音频文件。浏览器将使用第一个可识别的格式:
<audio controls="controls"> <source src="song.ogg" type="audio/ogg"> <source src="song.mp3" type="audio/mpeg"> Your browser does not support the audio tag. </audio>
属性 | 值 | 描述 |
---|---|---|
autoplay | autoplay | 若是出现该属性,则音频在就绪后立刻播放。 |
controls | controls | 若是出现该属性,则向用户显示控件,好比播放按钮。 |
loop | loop | 若是出现该属性,则每当音频结束时从新开始播放。 |
preload | preload | 若是出现该属性,则音频在页面加载时进行加载,并预备播放。若是使用 "autoplay",则忽略该属性。 |
src | url | 要播放的音频的 URL。 |
事件与控制和视频的相同。
三、拖放
拖放(Drag 和 drop)是 HTML5 标准的组成部分,抓取对象之后拖到另外一个位置。在 HTML5 中,任何元素都可以拖放。
示例以下:
<!DOCTYPE HTML> <html> <head> <style type="text/css"> #div1 {width:488px;height:70px;padding:10px;border:1px solid #aaaaaa;} </style> <script type="text/javascript"> function allowDrop(ev) { ev.preventDefault(); } function drag(ev) { ev.dataTransfer.setData("Text",ev.target.id); } function drop(ev) { ev.preventDefault(); var data=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); } </script> </head> <body> <p>请把 W3School 的图片拖放到矩形中:</p> <div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div> <br /> <img id="drag1" src="/i/w3school_banner.gif" draggable="true" ondragstart="drag(event)" /> </body> </html>
看起来很复杂,可是分步分析要简单一下。
拖放通常状况下都须要借助javascript来辅助处理,一个拖放的步骤以下:
第一步:设置对象为可拖放的。
<img draggable="true" />
第二步:什么被拖动了
分别调用ondragstart 和 setData(),ondragstart是当拖动开始时执行的方法,上面的例子在拖动开始时调动drag(event)方法,传递进去一个event参数,这个event参数中包含被拖动的元素,也即本元素。
第三步:拖动时触发什么操做
调用event.dataTransfer.setData() 方法设置被拖数据的数据类型和值:
function drag(ev)
{
ev.dataTransfer.setData("Text",ev.target.id);
}
在这个例子中,数据类型是 "Text",值是可拖动元素的 id ("drag1")。
第四步:放到何处
ondragover 事件规定在何处放置被拖动的数据。默认地,没法将数据/元素放置到其余元素中。若是须要设置容许放置,咱们必须阻止对元素的默认处理方式。这要经过调用 ondragover 事件的 event.preventDefault() 方法:event.preventDefault()。
<div id="div1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
这里定义了放置时触发什么事件(用于放置内容),被拖动到上面时触发什么事件(用于执行上面的preventDefault()方法)
第五步:进行放置
当放置被拖数据时,会发生 drop 事件。在上面的例子中,ondrop 属性调用了一个函数,drop(event):
function drop(ev) { ev.preventDefault(); var data=ev.dataTransfer.getData("Text"); ev.target.appendChild(document.getElementById(data)); }
调用 preventDefault() 来避免浏览器对数据的默认处理(drop 事件的默认行为是以连接形式打开)
经过 dataTransfer.getData("Text") 方法得到被拖的数据。该方法将返回在 setData() 方法中设置为相同类型的任何数据。
被拖数据是被拖元素的 id ("drag1")
把被拖元素追加到放置元素(目标元素)中
其中event.target返回的是触发事件的目标,也即触发事件的元素。
四、画布
HTML5中又一个强大的功能,canvas 元素,用于在网页上绘制图形。
HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像。画布是一个矩形区域,您能够控制其每一像素。canvas 拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。利用画布和javascript能够制做一些简单的HTML5游戏。
使用方法:
<canvas id="myCanvas" width="200" height="100"></canvas>
canvas 元素自己是没有绘图能力的。全部的绘制工做必须在 JavaScript 内部完成:
<script type="text/javascript"> var c=document.getElementById("myCanvas"); var cxt=c.getContext("2d"); cxt.fillStyle="#FF0000"; cxt.fillRect(0,0,150,75); cxt.moveTo(10,10); cxt.lineTo(150,50); cxt.lineTo(10,50); cxt.stroke(); cxt.beginPath(); cxt.arc(70,18,15,0,Math.PI*2,true); cxt.closePath(); cxt.fill(); var grd=cxt.createLinearGradient(0,0,175,50); grd.addColorStop(0,"#FF0000"); grd.addColorStop(1,"#00FF00"); cxt.fillStyle=grd; cxt.fillRect(0,0,175,50); var img=new Image() img.src="flower.png" cxt.drawImage(img,0,0); </script>
首先获取canvas对象,而后使用对象的getContext方法获取一个context对象,能够是2d的也能够是3d的。
getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。
坐标原点是左上角。
五、SVG矢量图形
一个直接画矢量图的方法出如今了HTML5中,他就是SVG元素。
HTML5 支持内联 SVG。
与其余图像格式相比(好比 JPEG 和 GIF),使用 SVG 的优点在于:
直接内联SVG:
<!DOCTYPE html> <html> <body> <svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="190"> <polygon points="100,10 40,180 190,60 10,60 160,180" style="fill:lime;stroke:purple;stroke-width:5;fill-rule:evenodd;" /> </svg> </body> </html>
更多更强大的功能参考:SVG教程
插播:SVG与canvas的区别:
Canvas 和 SVG 都容许您在浏览器中建立图形,可是它们在根本上是不一样的。
SVG 是一种使用 XML 描述 2D 图形的语言。
SVG 基于 XML,这意味着 SVG DOM 中的每一个元素都是可用的。您能够为某个元素附加 JavaScript 事件处理器。
在 SVG 中,每一个被绘制的图形均被视为对象。若是 SVG 对象的属性发生变化,那么浏览器可以自动重现图形。
Canvas 经过 JavaScript 来绘制 2D 图形。
Canvas 是逐像素进行渲染的。
在 canvas 中,一旦图形被绘制完成,它就不会继续获得浏览器的关注。若是其位置发生变化,那么整个场景也须要从新绘制,包括任何或许已被图形覆盖的对象。
Canvas |
SVG |
依赖分辨率 | 不依赖分辨率 |
不支持事件处理器 | 支持事件处理器 |
弱的文本渲染能力 | 最适合带有大型渲染区域的应用程序(好比谷歌地图) |
可以以 .png 或 .jpg 格式保存结果图像 | 复杂度高会减慢渲染速度(任何过分使用 DOM 的应用都不快) |
最适合图像密集型的游戏,其中的许多对象会被频繁重绘 | 不适合游戏应用 |
六、地理定位
在移动网站上颇有用,经过网页获取位置展现内容等等。
HTML5 Geolocation API 用于得到用户的地理位置。
示例:
<!DOCTYPE html> <html> <body> <p id="demo">点击按钮获取您当前坐标(可能须要比较长的时间获取):</p> <button onclick="getLocation()">点我</button> <script> var x=document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition,showError); } else{x.innerHTML="Geolocation is not supported by this browser.";} } function showPosition(position) { x.innerHTML="纬度: " + position.coords.latitude + "<br>经度: " + position.coords.longitude; } function showError(error) { switch(error.code) { case error.PERMISSION_DENIED: x.innerHTML="用户拒绝对获取地理位置的请求。" break; case error.POSITION_UNAVAILABLE: x.innerHTML="位置信息是不可用的。" break; case error.TIMEOUT: x.innerHTML="请求用户地理位置超时。" break; case error.UNKNOWN_ERROR: x.innerHTML="未知错误。" break; } } </script> </body> </html>
position对象的成员有:
属性 | 描述 |
---|---|
coords.latitude | 十进制数的纬度 |
coords.longitude | 十进制数的经度 |
coords.accuracy | 位置精度 |
coords.altitude | 海拔,海平面以上以米计 |
coords.altitudeAccuracy | 位置的海拔精度 |
coords.heading | 方向,从正北开始以度计 |
coords.speed | 速度,以米/每秒计 |
timestamp | 响应的日期/时间 |
其余有趣的方法:
watchPosition() - 返回用户的当前位置,并继续返回用户移动时的更新位置(就像汽车上的 GPS)。
clearWatch() - 中止 watchPosition() 方法
下面的例子展现 watchPosition() 方法。您须要一台精确的 GPS 设备来测试该例(好比 iPhone):
<!DOCTYPE html> <html> <body> <p id="demo">点击按钮获取您当前坐标(可能须要比较长的时间获取):</p> <button onclick="getLocation()">点我</button> <script> var x=document.getElementById("demo"); function getLocation() { if (navigator.geolocation) { navigator.geolocation.watchPosition(showPosition); } else{x.innerHTML="该浏览器不支持获取地理位置。";} } function showPosition(position) { x.innerHTML="纬度: " + position.coords.latitude + "<br>经度: " + position.coords.longitude; } </script> </body> </html>
获取地理位置的功能能够与Google Map结合使用,制做一些地图类的网页。关于与地图API结合使用,参考网络。
七、HTML5存储
用于在客户端存储数据,由于HTTP是无状态连接,能够把一些内容放在本地存储中。
HTML5 提供了两种在客户端存储数据的新方法:
localStorage - 没有时间限制的数据存储,sessionStorage - 针对一个 session 的数据存储。
以前,这些都是由 cookie 完成的。可是 cookie 不适合大量数据的存储,由于它们由每一个对服务器的请求来传递,这使得 cookie 速度很慢并且效率也不高。
在 HTML5 中,数据不是由每一个服务器请求传递的,而是只有在请求时使用数据。它使在不影响网站性能的状况下存储大量数据成为可能。
对于不一样的网站,数据存储于不一样的区域,而且一个网站只能访问其自身的数据。
HTML5 使用 JavaScript 来存储和访问数据。
localStorage 方法:localStorage 方法存储的数据没有时间限制。次日、第二周或下一年以后,数据依然可用。如何建立和访问 localStorage:
<!DOCTYPE HTML> <html> <body> <script type="text/javascript"> if (localStorage.pagecount) { localStorage.pagecount=Number(localStorage.pagecount) +1; } else { localStorage.pagecount=1; } document.write("Visits: " + localStorage.pagecount + " time(s)."); </script> <p>刷新页面会看到计数器在增加。</p> <p>请关闭浏览器窗口,而后再试一次,计数器会继续计数。</p> </body> </html>
sessionStorage 方法
sessionStorage 方法针对一个 session 进行数据存储。当用户关闭浏览器窗口后,数据会被删除。如何建立并访问一个 sessionStorage:
<!DOCTYPE HTML> <html> <body> <script type="text/javascript"> if (sessionStorage.pagecount) { sessionStorage.pagecount=Number(sessionStorage.pagecount) +1; } else { sessionStorage.pagecount=1; } document.write("Visits " + sessionStorage.pagecount + " time(s) this session."); </script> <p>刷新页面会看到计数器在增加。</p> <p>请关闭浏览器窗口,而后再试一次,计数器已经重置了。</p> </body> </html>
八、应用缓存
鉴于HTML强大的功能,能够作一些WEB应用,可是若是应用比较大,每次打开都须要很长时间,这个时候就须要用到应用缓存了。
使用 HTML5,经过建立 cache manifest 文件,能够轻松地建立 web 应用的离线版本。
HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网链接时进行访问。
应用程序缓存为应用带来三个优点:
离线浏览 - 用户可在应用离线时使用它们
速度 - 已缓存资源加载得更快
减小服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源。
如下是一个能够离线浏览的网页的示例:
<!DOCTYPE html> <html manifest="/example/html5/demo_html.appcache"> <body> <script type="text/javascript" src="/example/html5/demo_time.js"> </script> <p id="timePara"><button onclick="getDateTime()">得到日期和事件</button></p> <p><img src="/i/w3school_banner.gif" /></p> <p>请打开<a href="/example/html5/html5_html_manifest.html" target="_blank">这个页面</a>,而后脱机浏览,从新加载页面。页面中的脚本和图像依然可用。</p> </body> </html>
使用说明:
如需启用应用程序缓存,请在文档的 <html> 标签中包含 manifest 属性,每一个指定了 manifest 的页面在用户对其访问时都会被缓存。若是未指定 manifest 属性,则页面不会被缓存(除非在 manifest 文件中直接指定了该页面)。manifest 文件的建议的文件扩展名是:".appcache"。
注意:manifest 文件须要配置正确的 MIME-type,即 "text/cache-manifest"。必须在 web 服务器上进行配置。
manifest 文件:
manifest 文件是简单的文本文件,它告知浏览器被缓存的内容(以及不缓存的内容)。
manifest 文件可分为三个部分:
CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存
NETWORK - 在此标题下列出的文件须要与服务器的链接,且不会被缓存
FALLBACK - 在此标题下列出的文件规定当页面没法访问时的回退页面(好比 404 页面)
(1)、CACHE MANIFEST:第一行,CACHE MANIFEST,是必需的:
CACHE MANIFEST
/theme.css
/logo.gif
/main.js
上面的 manifest 文件列出了三个资源:一个 CSS 文件,一个 GIF 图像,以及一个 JavaScript 文件。当 manifest 文件加载后,浏览器会从网站的根目录下载这三个文件。而后,不管用户什么时候与因特网断开链接,这些资源依然是可用的。
(2)、NETWORK
下面的 NETWORK 小节规定文件 "login.asp" 永远不会被缓存,且离线时是不可用的:
NETWORK:
login.asp
可使用星号来指示全部其余资源/文件都须要因特网链接。
(3)、FALLBACK
下面的 FALLBACK 小节规定若是没法创建因特网链接,则用 "offline.html" 替代 /html5/ 目录中的全部文件:
FALLBACK:
/html5/ /404.html
第一个 URI 是资源,第二个是替补。
那么如何更新缓存呢?
一旦应用被缓存,它就会保持缓存直到发生下列状况:
用户清空浏览器缓存
manifest 文件被修改(参阅下面的提示)
由程序来更新应用缓存
完整的示例:
CACHE MANIFEST
# 2012-02-21 v1.0.0
/theme.css
/logo.gif
/main.js
NETWORK:
login.asp
FALLBACK:
/html5/ /404.html
重要提示:以 "#" 开头的是注释行,但也可知足其余用途。应用的缓存会在其 manifest 文件更改时被更新。若是您编辑了一幅图片,或者修改了一个 JavaScript 函数,这些改变都不会被从新缓存。更新注释行中的日期和版本号是一种使浏览器从新缓存文件的办法。
注意:一旦文件被缓存,则浏览器会继续展现已缓存的版本,即便您修改了服务器上的文件。为了确保浏览器更新缓存,您须要更新 manifest 文件。
浏览器对缓存数据的容量限制可能不太同样(某些浏览器设置的限制是每一个站点 5MB)。
九、Web Workers
当网页在执行javascript时,您的网页可能会暂时失去响应,可是若是是个很是耗时间的javascript呢,网页失去响应可能会被用户觉得浏览器崩溃了,这就得不偿失了,在应用软件中咱们可使用多线程解决这个问题,在HTML5中也引入了相似的功能,叫作Web Workers。
web worker 是运行在后台的 JavaScript,独立于其余脚本,不会影响页面的性能。您能够继续作任何愿意作的事情:点击、选取内容等等,而此时 web worker 在后台运行。
使用方法:首先须要建立一个JS脚本,用于在后台执行:
var i=0;
function timedCount()
{
i=i+1;
postMessage(i);
setTimeout("timedCount()",500);
}
timedCount();
以上代码中重要的部分是 postMessage() 方法 - 它用于向 HTML 页面传回一段消息。
而后就是页面中的部分了:
<!DOCTYPE html> <html> <body> <p>计数: <output id="result"></output></p> <button onclick="startWorker()">开始 Worker</button> <button onclick="stopWorker()">中止 Worker</button> <br /><br /> <script> var w; function startWorker() { if(typeof(Worker)!=="undefined") { if(typeof(w)=="undefined") { w=new Worker("/example/html5/demo_workers.js"); } w.onmessage = function (event) { document.getElementById("result").innerHTML=event.data; }; } else { document.getElementById("result").innerHTML="Sorry, your browser does not support Web Workers..."; } } function stopWorker() { w.terminate(); } </script> </body> </html>
先判断浏览器是否支持worker,而后再判断worker是否已建立,没有建立则建立一个worker,内容是咱们的js脚本。
为worker对象添加onmessage事件监听器,当worker对象使用postMessage(?)方法传递一个对象时,就会触发onmessage事件。
在onmessage事件监听器中,经过读取event.data来读取postMessage传递的值。
中止worker时使用w.terminate(),释放资源。
因为 web worker 位于外部文件中,它们没法访问下例 JavaScript 对象:window 对象,document 对象,parent 对象。
十、HTML5 服务器发送事件(Server-Sent Events)
Server-Sent 事件指的是网页自动获取来自服务器的更新。
之前也可能作到这一点,前提是网页不得不询问是否有可用的更新。经过服务器发送事件,更新可以自动到达。
示例:
<!DOCTYPE html> <html> <body> <h1>获取服务端更新数据</h1> <div id="result"></div> <script> if(typeof(EventSource)!=="undefined") { var source=new EventSource("demo_sse.php"); source.onmessage=function(event) { document.getElementById("result").innerHTML+=event.data + "<br>"; }; } else { document.getElementById("result").innerHTML="抱歉,你的浏览器不支持 server-sent 事件..."; } </script> </body> </html>
先检查是否支持SSE,支持再作处理。
服务器端代码示例:
为了让上面的例子能够运行,您还须要可以发送数据更新的服务器(好比 PHP 和 ASP)。
服务器端事件流的语法是很是简单的。把 "Content-Type" 报头设置为 "text/event-stream"。如今,您能够开始发送事件流了。
<?php header('Content-Type: text/event-stream'); header('Cache-Control: no-cache'); $time = date('r'); echo "data: The server time is: {$time}\n\n"; flush(); ?>
<% Response.ContentType="text/event-stream" Response.Expires=-1 Response.Write("data: " & now()) Response.Flush() %>
把报头 "Content-Type" 设置为 "text/event-stream"
规定不对页面进行缓存
输出发送日期(始终以 "data: " 开头)
向网页刷新输出数据
在上面的例子中,咱们使用 onmessage 事件来获取消息。不过还可使用其余事件:
事件 | 描述 |
---|---|
onopen | 当通往服务器的链接被打开时 |
onmessage | 当接收到消息时 |
onerror | 当错误发生时 |
onclose | 当链接关闭时 |
以上能够看做是HTTP的SOCKET通讯,更多详细内容参考WebSocket。
十一、新的语义元素与表单元素