HTML5 - 快速指南



HTML5 - 概述

HTML5 是 HTML 标准的下一个主要修订版本,取代了 HTML 4.01、XHTML 1.0 和 XHTML 1.1。HTML5 是一个用于在万维网上构建和呈现内容的标准。

HTML5 是万维网联盟 (W3C) 和 Web 超文本应用技术工作组 (WHATWG) 之间的合作成果。

新标准包含了视频回放和拖放等功能,这些功能以前依赖于第三方浏览器插件,例如 Adobe Flash、Microsoft Silverlight 和 Google Gears。

浏览器支持

最新版本的 Apple Safari、Google Chrome、Mozilla Firefox 和 Opera 都支持许多 HTML5 功能,Internet Explorer 9.0 也将支持一些 HTML5 功能。

预装在 iPhone、iPad 和 Android 手机上的移动网络浏览器都对 HTML5 提供了极佳的支持。

新功能

HTML5 引入了一些新的元素和属性,可以帮助您构建现代网站。以下是一些 HTML5 中引入的最突出功能。

  • 新的语义元素 - 这些元素例如 <header>、<footer> 和 <section>。

  • 表单 2.0 - 对 HTML 网页表单的改进,其中为 <input> 标签引入了新的属性。

  • 持久本地存储 - 实现持久本地存储,无需依赖第三方插件。

  • WebSocket - 一种用于 Web 应用程序的新一代双向通信技术。

  • 服务器发送事件 - HTML5 引入了从 Web 服务器流向 Web 浏览器的事件,称为服务器发送事件 (SSE)。

  • Canvas - 支持一个二维绘图表面,您可以使用 JavaScript 对其进行编程。

  • 音频和视频 - 您可以将音频或视频嵌入到网页中,无需依赖第三方插件。

  • 地理位置 - 现在,访问者可以选择与您的 Web 应用程序共享其物理位置。

  • 微数据 - 这使您可以创建超出 HTML5 的词汇表,并使用自定义语义扩展您的网页。

  • 拖放 - 将项目从一个位置拖放到同一网页上的另一个位置。

向后兼容性

HTML5 尽可能地设计为向后兼容现有的 Web 浏览器。其新功能构建在现有功能的基础上,并允许您为旧版浏览器提供回退内容。

建议使用几行 JavaScript 检测对各个 HTML5 功能的支持。

如果您不熟悉 HTML 的任何先前版本,建议您在探索 HTML5 功能之前先阅读我们的HTML 教程

HTML5 - 语法

HTML 5 语言具有“自定义”HTML 语法,该语法与 Web 上发布的 HTML 4 和 XHTML1 文档兼容,但不兼容 HTML 4 的更深奥的 SGML 功能。

HTML 5 的语法规则与 XHTML 不同,在 XHTML 中,我们需要使用小写标签名称,引用我们的属性,属性必须具有值,并且必须关闭所有空元素。

HTML5 具有很大的灵活性,它支持以下功能 -

  • 大写标签名称。
  • 属性的引号是可选的。
  • 属性值是可选的。
  • 关闭空元素是可选的。

DOCTYPE

在旧版本的 HTML 中,DOCTYPE 更长,因为 HTML 语言基于 SGML,因此需要引用 DTD。

HTML 5 作者将使用简单的语法指定 DOCTYPE,如下所示 -

<!DOCTYPE html>

以上语法不区分大小写。

字符编码

HTML 5 作者可以使用简单的语法指定字符编码,如下所示 -

<meta charset = "UTF-8">

以上语法不区分大小写。

<script> 标签

通常的做法是在脚本元素中添加一个类型属性,其值为“text/javascript”,如下所示 -

<script type = "text/javascript" src = "scriptfile.js"></script> 

HTML 5 去除了所需的额外信息,您可以简单地使用以下语法 -

<script src = "scriptfile.js"></script>

<link> 标签

到目前为止,您一直将 <link> 编写如下 -

<link rel = "stylesheet" type = "text/css" href = "stylefile.css">

HTML 5 去除了所需的额外信息,您可以简单地使用以下语法 -

<link rel = "stylesheet" href = "stylefile.css">

HTML5 元素

HTML5 元素使用开始标签和结束标签进行标记。标签使用尖括号分隔,标签名称位于尖括号之间。

开始标签和结束标签的区别在于,后者在标签名称前包含一个斜杠。

以下是一个 HTML5 元素的示例 -

<p>...</p>

HTML5 标签名称不区分大小写,可以全部大写或混合大小写,尽管最常见的约定是坚持使用小写。

大多数元素包含一些内容,例如 <p>...</p> 包含一段文字。但是,有些元素禁止包含任何内容,这些元素称为空元素。例如,br、hr、link、meta 等。

以下是 HTML5 元素 的完整列表。

HTML5 属性

元素可能包含用于设置元素各种属性的属性。

一些属性是全局定义的,可以在任何元素上使用,而另一些属性仅为特定元素定义。所有属性都有名称和值,如下面的示例所示。

以下是一个 HTML5 属性的示例,说明如何使用值为“example”的名为 class 的属性标记 div 元素 -

<div class = "example">...</div>

属性只能在开始标签内指定,绝不能在结束标签中使用。

HTML5 属性不区分大小写,可以全部大写或混合大小写,尽管最常见的约定是坚持使用小写。

以下是 HTML5 属性 的完整列表。

HTML5 文档

以下标签已引入以实现更好的结构 -

  • section - 此标签表示通用文档或应用程序部分。它可以与 h1-h6 一起使用以指示文档结构。

  • article - 此标签表示文档的独立内容部分,例如博客文章或报纸文章。

  • aside - 此标签表示与页面其余部分略微相关的部分内容。

  • header - 此标签表示部分的标题。

  • footer - 此标签表示部分的页脚,可以包含有关作者、版权信息等信息。

  • nav - 此标签表示用于导航的文档部分。

  • dialog - 此标签可用于标记对话。

  • figure - 此标签可用于将标题与某些嵌入内容(例如图形或视频)关联起来。

HTML 5 文档的标记如下所示 -

<!DOCTYPE html> 

<html>  
   <head> 
      <meta charset = "utf-8"> 
      <title>...</title> 
   </head> 
  
   <body> 
      <header>...</header> 
      <nav>...</nav> 
      
      <article> 
         <section> 
            ... 
         </section> 
      </article> 
      <aside>...</aside> 
      
      <footer>...</footer> 
   </body> 
</html> 
在线演示
<!DOCTYPE html>  

<html>  
   <head> 
      <meta charset = "utf-8"> 
      <title>...</title> 
   </head> 
  
   <body> 
      <header role = "banner"> 
         <h1>HTML5 Document Structure Example</h1> 
         <p>This page should be tried in safari, chrome or Mozila.</p> 
      </header> 
   
      <nav> 
         <ul> 
            <li><a href = "https://tutorialspoint.com/html">HTML Tutorial</a></li> 
            <li><a href = "https://tutorialspoint.com/css">CSS Tutorial</a></li> 
            <li><a href = "https://tutorialspoint.com/javascript">
            JavaScript Tutorial</a></li> 
         </ul> 
      </nav> 
   
      <article> 
         <section> 
            <p>Once article can have multiple sections</p>
         </section> 
      </article> 
   
      <aside> 
         <p>This is  aside part of the web page</p> 
      </aside> 
   
      <footer> 
         <p>Created by <a href = "https://tutorialspoint.com/">Tutorials Point</a></p> 
      </footer> 
   
   </body> 
</html> 

它将产生以下结果 -

HTML5 - 属性

如上一章所述,元素可能包含用于设置元素各种属性的属性。

一些属性是全局定义的,可以在任何元素上使用,而另一些属性仅为特定元素定义。所有属性都有名称和值,如下面的示例所示。

以下是一个 HTML5 属性的示例,说明如何使用值为“example”的名为 class 的属性标记 div 元素 -

<div class = "example">...</div>

属性只能在开始标签内指定,绝不能在结束标签中使用。

HTML5 属性不区分大小写,可以全部大写或混合大小写,尽管最常见的约定是坚持使用小写。

标准属性

以下列出的属性几乎所有 HTML 5 标签都支持。

属性 选项 功能
accesskey 用户定义 指定访问元素的键盘快捷键。
align right, left, center 水平对齐标签
background URL 在元素后面放置背景图像
bgcolor 数字、十六进制、RGB 值 在元素后面放置背景颜色
class 用户定义 将元素分类以用于级联样式表。
contenteditable true, false 指定用户是否可以编辑元素的内容。
contextmenu 菜单 ID 指定元素的上下文菜单。
data-XXXX 用户定义 自定义属性。HTML 文档的作者可以定义自己的属性。必须以“data-”开头。
draggable

true、false、auto 指定用户是否允许拖动元素。
height 数值 指定表格、图像或表格单元格的高度。
hidden hidden 指定元素是否可见。
id 用户定义 为元素命名,以便与层叠样式表一起使用。
item 元素列表 用于对元素进行分组。
itemprop 项目列表 用于对项目进行分组。
spellcheck true, false 指定是否必须检查元素的拼写或语法。
style CSS样式表 为元素指定内联样式。
subject 用户定义ID 指定元素对应的项目。
tabindex Tab编号 指定元素的Tab顺序。
title 用户定义 元素的“弹出”标题。
valign top、middle、bottom 垂直对齐HTML元素内的标签。
width 数值 指定表格、图像或表格单元格的宽度。

有关HTML5标签和相关属性的完整列表,请查看我们对HTML5标签的参考。

自定义属性

HTML 5引入的一项新功能是添加自定义数据属性。

自定义数据属性以data-开头,并根据您的需求命名。以下是一个简单的示例:

<div class = "example" data-subject = "physics" data-level = "complex">
   ...
</div>

以上代码将是完全有效的HTML5,其中包含两个名为datasubjectdata-level的自定义属性。您可以使用JavaScript API或CSS以与获取标准属性类似的方式获取这些属性的值。

HTML5 - 事件

当用户访问您的网站时,他们会执行各种活动,例如单击文本、图像和链接、将鼠标悬停在定义的元素上等。这些是JavaScript称为事件的示例。

我们可以在Javascript或VBscript中编写事件处理程序,并且您可以将这些事件处理程序指定为事件标签属性的值。HTML5规范定义了各种事件属性,如下所示:

我们可以使用以下属性集来触发任何javascriptvbscript代码(作为值给出),当任何HTML5元素发生任何事件时。

在后续章节中,我们将在详细讨论这些元素时介绍特定于元素的事件。

属性 描述
offline script 当文档离线时触发
onabort script 在中止事件时触发
onafterprint script 文档打印后触发
onbeforeonload script 文档加载前触发
onbeforeprint script 文档打印前触发
onblur script 窗口失去焦点时触发
oncanplay script 媒体可以开始播放时触发,但可能需要停止缓冲
oncanplaythrough script 媒体可以播放到结尾时触发,无需停止缓冲
onchange script 元素发生变化时触发
onclick script 鼠标单击时触发
oncontextmenu script 触发上下文菜单时触发
ondblclick script 鼠标双击时触发
ondrag script 拖动元素时触发
ondragend script 拖动操作结束时触发
ondragenter script 将元素拖动到有效放置目标时触发
ondragleave script 元素离开有效放置目标时触发
ondragover script 将元素拖过有效放置目标时触发
ondragstart script 拖动操作开始时触发
ondrop script 拖动元素被放下时触发
ondurationchange script 媒体长度发生变化时触发
onemptied script 媒体资源元素突然变空时触发。
onended script 媒体到达结尾时触发
onerror script 发生错误时触发
onfocus script 窗口获得焦点时触发
onformchange script 表单发生变化时触发
onforminput script 表单获得用户输入时触发
onhaschange script 文档发生变化时触发
oninput script 元素获得用户输入时触发
oninvalid script 元素无效时触发
onkeydown script 按下键时触发
onkeypress script 按下并释放键时触发
onkeyup script 释放键时触发
onload script 文档加载时触发
onloadeddata script 媒体数据加载时触发
onloadedmetadata script 媒体元素的持续时间和其他媒体数据加载时触发
onloadstart script 浏览器开始加载媒体数据时触发
onmessage script 触发消息时触发
onmousedown script 按下鼠标按钮时触发
onmousemove script 鼠标指针移动时触发
onmouseout script 鼠标指针移出元素时触发
onmouseover script 鼠标指针移到元素上时触发
onmouseup script 释放鼠标按钮时触发
onmousewheel script 旋转鼠标滚轮时触发
onoffline script 当文档离线时触发
onoine script 文档上线时触发
ononline script 文档上线时触发
onpagehide script 窗口隐藏时触发
onpageshow script 窗口可见时触发
onpause script 媒体数据暂停时触发
onplay script 媒体数据即将开始播放时触发
onplaying script 媒体数据开始播放时触发
onpopstate script 窗口历史记录更改时触发
onprogress script 浏览器正在获取媒体数据时触发
onratechange script 媒体数据的播放速率发生变化时触发
onreadystatechange script 就绪状态发生变化时触发
onredo script 文档执行重做操作时触发
onresize script 窗口大小调整时触发
onscroll script 滚动元素的滚动条时触发
onseeked script 媒体元素的seeking属性不再为true,并且搜索已结束时触发
onseeking script 媒体元素的seeking属性为true,并且搜索已开始时触发
onselect script 选择元素时触发
onstalled script 获取媒体数据时发生错误时触发
onstorage script 文档加载时触发
onsubmit script 提交表单时触发
onsuspend script 浏览器一直在获取媒体数据,但在获取整个媒体文件之前停止时触发
ontimeupdate script 媒体更改其播放位置时触发
onundo script 文档执行撤消操作时触发
onunload script 用户离开文档时触发
onvolumechange script 媒体更改音量时触发,将音量设置为“静音”时也会触发
onwaiting script 媒体已停止播放,但预计将恢复时触发

HTML5 - Web 表单 2.0

Web Forms 2.0是对HTML4中表单功能的扩展。HTML5中的表单元素和属性提供了比HTML4更高的语义标记程度,使我们免于在HTML4中需要的大量繁琐的脚本编写和样式设置。

HTML4中的<input>元素

HTML4输入元素使用type属性指定数据类型。HTML4提供以下类型:

序号 类型&描述
1

text

自由格式文本字段,通常不包含换行符。

2

password

用于敏感信息的自由格式文本字段,通常不包含换行符。

3

checkbox

从预定义列表中选择零个或多个值。

4

radio

枚举值。

5

submit

自由形式的按钮,用于启动表单提交。

6

file

具有MIME类型并可选地具有文件名的任意文件。

7

image

相对于特定图像大小的坐标,其额外语义是它必须是最后一个选定的值并启动表单提交。

8

hidden

通常不显示给用户的任意字符串。

9

select

枚举值,类似于radio类型。

10

textarea

自由格式文本字段,通常没有换行符限制。

11

button

自由形式的按钮,可以启动与按钮相关的任何事件。

以下是如何使用标签、单选按钮和提交按钮的简单示例:

... 
<form action = "http://example.com/cgiscript.pl" method = "post">  
   <p> 
      <label for = "firstname">first name: </label> 
      <input type = "text" id = "firstname"><br /> 
   
      <label for = "lastname">last name: </label> 
      <input type = "text" id = "lastname"><br /> 
   
      <label for = "email">email: </label> 
      <input type = "text" id = "email"><br> 
   
      <input type = "radio" name = "sex" value = "male"> Male<br> 
      <input type = "radio" name = "sex" value = "female"> Female<br> 
      <input type = "submit" value = "send"> <input type = "reset"> 
   </p> 
</form> 
 ... 

HTML5中的<input>元素

除了上述属性外,HTML5输入元素还为type属性引入了几个新值。这些列在下面。

注意:请使用最新版本的Opera浏览器尝试以下所有示例。

序号 类型&描述
1 datetime

日期和时间(年、月、日、时、分、秒、秒的小数部分),根据ISO 8601编码,时区设置为UTC。

2 datetime-local

日期和时间(年、月、日、时、分、秒、秒的小数部分),根据ISO 8601编码,不包含时区信息。

3 date

日期(年、月、日),根据ISO 8601编码。

4 month

由年和月组成的日期,根据ISO 8601编码。

5 week

由年和周数组成的日期,根据ISO 8601编码。

6 time

时间(时、分、秒、秒的小数部分),根据ISO 8601编码。

7 number

仅接受数值。step属性指定精度,默认为1。

8 range

range类型用于输入字段,这些字段应包含一定范围内的数值。

9 email

仅接受电子邮件值。此类型用于应包含电子邮件地址的输入字段。如果您尝试提交简单的文本,它将强制您以[email protected]格式仅输入电子邮件地址。

10 url

它仅接受 URL 值。此类型用于应包含 URL 地址的输入字段。如果您尝试提交简单文本,它会强制您仅输入 http://www.example.com 格式或 http://example.com 格式的 URL 地址。

<output> 元素

HTML5 引入了一个新的元素 <output>,用于表示不同类型输出的结果,例如脚本编写的输出。

您可以使用 for 属性来指定输出元素与文档中影响计算的其他元素(例如,作为输入或参数)之间的关系。for 属性的值是其他元素 ID 的空格分隔列表。

在线演示
<!DOCTYPE HTML>

<html>
   <head>
      <script type = "text/javascript">
         
         function showResult() {
            x = document.forms["myform"]["newinput"].value;
            document.forms["myform"]["result"].value = x;
         }
      </script>
   </head>
   
   <body>

      <form action = "/cgi-bin/html5.cgi" method = "get" name = "myform">
         Enter a value : <input type = "text" name = "newinput" />
         <input type = "button" value = "Result"  onclick = "showResult();" />
         <output name = "result"></output>
      </form>
		
   </body>
</html>

它将产生以下结果 -

占位符属性

HTML5 引入了一个名为 placeholder 的新属性。此属性在 <input> 和 <textarea> 元素上为用户提供有关可以在字段中输入什么的提示。占位符文本不得包含回车符或换行符。

以下是占位符属性的简单语法:

<input type = "text" name = "search" placeholder = "search the web"/>

此属性仅受最新版本的 Mozilla、Safari 和 Chrome 浏览器支持。

在线演示
<!DOCTYPE HTML>

<html>
   <body>

      <form action = "/cgi-bin/html5.cgi" method = "get">
         Enter email : <input type = "email" name = "newinput" 
            placeholder = "[email protected]"/>
         <input type = "submit" value = "submit" />
      </form>

   </body>
</html>

这将产生以下结果:

自动聚焦属性

这是一个简单的单步模式,在文档加载时使用 JavaScript 轻松编程,自动聚焦一个特定的表单字段。

HTML5 引入了一个名为 autofocus 的新属性,使用方法如下:

<input type = "text" name = "search" autofocus/>

此属性仅受最新版本的 Mozilla、Safari 和 Chrome 浏览器支持。

<!DOCTYPE HTML>

<html>
   <body>
   
      <form action = "/cgi-bin/html5.cgi" method = "get">
         Enter email : <input type = "text" name = "newinput" autofocus/>
         <p>Try to submit using Submit button</p>
         <input type = "submit" value = "submit" />
      </form>
      
   </body>
</html>

必填属性

现在您不再需要 JavaScript 进行客户端验证,例如空文本框将永远不会提交,因为 HTML5 引入了一个名为 required 的新属性,使用方法如下,并且会坚持要求有一个值:

<input type = "text" name = "search" required/>

此属性仅受最新版本的 Mozilla、Safari 和 Chrome 浏览器支持。

在线演示
<!DOCTYPE HTML>

<html>
   <body>
   
      <form action = "/cgi-bin/html5.cgi" method = "get">
         Enter email : <input type = "text" name = "newinput" required/>
         <p>Try to submit using Submit button</p>
         <input type = "submit" value = "submit" />
      </form>
      
   </body>
</html>

它将产生以下结果 -

HTML5 - SVG

SVG 代表 Scalable Vector Graphics,它是一种使用 XML 描述 2D 图形和图形应用程序的语言,然后由 SVG 查看器呈现 XML。

SVG 主要用于矢量类型图表,例如饼图、X、Y 坐标系中的二维图形等。

SVG 于 2003 年 1 月 14 日成为 W3C 推荐标准,您可以在 SVG 规范 中查看 SVG 规范的最新版本。

查看 SVG 文件

大多数网络浏览器可以像显示 PNG、GIF 和 JPG 一样显示 SVG。Internet Explorer 用户可能需要安装 Adobe SVG 查看器才能在浏览器中查看 SVG。

在 HTML5 中嵌入 SVG

HTML5 允许使用 <svg>...</svg> 标签直接嵌入 SVG,该标签具有以下简单语法:

<svg xmlns = "http://www.w3.org/2000/svg">
   ...    
</svg>

Firefox 3.7 还引入了一个配置选项(“about:config”),您可以在其中使用以下步骤启用 HTML5:

  • 在 Firefox 地址栏中输入 about:config

  • 单击出现的警告消息上的“我保证会小心!”按钮(并确保您遵守它!)。

  • 在页面顶部的过滤器栏中输入 html5.enable

  • 目前它将被禁用,因此单击它以将值切换为 true。

现在您的 Firefox HTML5 解析器应该已启用,您应该能够使用以下示例进行实验。

HTML5 - SVG 圆形

以下是 SVG 示例的 HTML5 版本,它将使用 <circle> 标签绘制一个圆形:

在线演示
<!DOCTYPE html>

<html>
   <head>
   
      <style>
         #svgelem {
            position: relative;
            left: 50%;
            -webkit-transform: translateX(-20%);
            -ms-transform: translateX(-20%);
            transform: translateX(-20%);
         }
      </style>
      <title>SVG</title>
      <meta charset = "utf-8" />
   </head>
   
   <body>
      <h2 align = "center">HTML5 SVG Circle</h2>
		
      <svg id = "svgelem" height = "200" xmlns = "http://www.w3.org/2000/svg">
         <circle id = "redcircle" cx = "50" cy = "50" r = "50" fill = "red" />
      </svg>
   </body>
</html>

这将在启用了 HTML5 的最新版 Firefox 中产生以下结果。

HTML5 - SVG 矩形

以下是 SVG 示例的 HTML5 版本,它将使用 <rect> 标签绘制一个矩形:

在线演示
<!DOCTYPE html>

<html>
   <head>
   
      <style>
         #svgelem {
            position: relative;
            left: 50%;
            -webkit-transform: translateX(-50%);
            -ms-transform: translateX(-50%);
            transform: translateX(-50%);
         }
      </style>
      <title>SVG</title>
      <meta charset = "utf-8" />
   </head>
   
   <body>
      <h2 align = "center">HTML5 SVG Rectangle</h2>
      
      <svg id = "svgelem" height = "200" xmlns = "http://www.w3.org/2000/svg">
         <rect id = "redrect" width = "300" height = "100" fill = "red" />
      </svg>
   </body>
</html>

这将在启用了 HTML5 的最新版 Firefox 中产生以下结果。

HTML5 - SVG 线

以下是 SVG 示例的 HTML5 版本,它将使用 <line> 标签绘制一条线:

在线演示
<!DOCTYPE html>

<html>
   <head>
      
      <style>
         #svgelem {
            position: relative;
            left: 50%;
            -webkit-transform: translateX(-50%);
            -ms-transform: translateX(-50%);
            transform: translateX(-50%);
         }
      </style>
      <title>SVG</title>
      <meta charset = "utf-8" />
   </head>
   
   <body>
      <h2 align = "center">HTML5 SVG Line</h2>
      
      <svg id = "svgelem" height = "200" xmlns = "http://www.w3.org/2000/svg">
         <line x1 = "0" y1 = "0" x2 = "200" y2 = "100" 
            style = "stroke:red;stroke-width:2"/>
      </svg>
   </body>
</html>

您可以使用 style 属性,该属性允许您设置其他样式信息,例如笔划和填充颜色、笔划宽度等。

这将在启用了 HTML5 的最新版 Firefox 中产生以下结果。

HTML5 - SVG 椭圆

以下是 SVG 示例的 HTML5 版本,它将使用 <ellipse> 标签绘制一个椭圆:

在线演示
<!DOCTYPE html>

<html>
   <head>
      
      <style>
         #svgelem {
            position: relative;
            left: 50%;
            -webkit-transform: translateX(-40%);
            -ms-transform: translateX(-40%);
            transform: translateX(-40%);
         }
      </style>
      <title>SVG</title>
      <meta charset = "utf-8" />
   </head>
	
   <body>
      <h2 align = "center">HTML5 SVG Ellipse</h2>
      
      <svg id = "svgelem" height = "200" xmlns = "http://www.w3.org/2000/svg">
         <ellipse cx = "100" cy = "50" rx = "100" ry = "50" fill = "red" />
      </svg>
		
   </body>
</html>

这将在启用了 HTML5 的最新版 Firefox 中产生以下结果。

HTML5 - SVG 多边形

以下是 SVG 示例的 HTML5 版本,它将使用 <polygon> 标签绘制一个多边形:

在线演示
<!DOCTYPE html>

<html>
   <head>
   
      <style>
         #svgelem {
            position: relative;
            left: 50%;
            -webkit-transform: translateX(-50%);
            -ms-transform: translateX(-50%);
            transform: translateX(-50%);
         }
      </style>
      <title>SVG</title>
      <meta charset = "utf-8" />
   </head>
	
   <body>
      <h2 align = "center">HTML5 SVG Polygon</h2>
      
      <svg id = "svgelem" height = "200" xmlns = "http://www.w3.org/2000/svg">
         <polygon  points = "20,10 300,20, 170,50" fill = "red" />
      </svg>
   </body>
</html>

这将在启用了 HTML5 的最新版 Firefox 中产生以下结果。

HTML5 - SVG 折线

以下是 SVG 示例的 HTML5 版本,它将使用 <polyline> 标签绘制一条折线:

在线演示
<!DOCTYPE html>

<html>
   <head>
      
      <style>
         #svgelem {
            position: relative;
            left: 50%;
            -webkit-transform: translateX(-20%);
            -ms-transform: translateX(-20%);
            transform: translateX(-20%);
         }
      </style>
      <title>SVG</title>
      <meta charset = "utf-8" />
   </head>
	
   <body>
      <h2 align = "center">HTML5 SVG Polyline</h2>
      <svg id = "svgelem" height = "200" xmlns = "http://www.w3.org/2000/svg">
         <polyline points = "0,0 0,20 20,20 20,40 40,40 40,60" fill = "red" />
      </svg>
   </body>
</html>

这将在启用了 HTML5 的最新版 Firefox 中产生以下结果。

HTML5 - SVG 渐变

以下是 SVG 示例的 HTML5 版本,它将使用 <ellipse> 标签绘制一个椭圆,并使用 <radialGradient> 标签定义 SVG 径向渐变。

类似地,您可以使用 <linearGradient> 标签创建 SVG 线性渐变。

在线演示
<!DOCTYPE html>

<html>
   <head>
      
      <style>
         #svgelem {
            position: relative;
            left: 50%;
            -webkit-transform: translateX(-40%);
            -ms-transform: translateX(-40%);
            transform: translateX(-40%);
         }
      </style>
      <title>SVG</title>
      <meta charset = "utf-8" />
   </head>
	
   <body>
      <h2 align = "center">HTML5 SVG Gradient Ellipse</h2>
      
      <svg id = "svgelem" height = "200" xmlns = "http://www.w3.org/2000/svg">
         <defs>
            <radialGradient id="gradient" cx = "50%" cy = "50%" r = "50%" fx = "50%" 
               fy = "50%">
               <stop offset = "0%" style = "stop-color:rgb(200,200,200); stop-opacity:0"/>
               <stop offset = "100%" style = "stop-color:rgb(0,0,255); stop-opacity:1"/>
            </radialGradient>
         </defs>
         <ellipse cx = "100" cy = "50" rx = "100" ry = "50" 
            style = "fill:url(#gradient)" />
      </svg>
		
   </body>
</html>

这将在启用了 HTML5 的最新版 Firefox 中产生以下结果。

HTML5 - SVG 星形

以下是 SVG 示例的 HTML5 版本,它将使用 <polygon> 标签绘制一个星形。

在线演示
<html>
   <head>
   
      <style>
         #svgelem {
            position: relative;
            left: 50%;
            -webkit-transform: translateX(-40%);
            -ms-transform: translateX(-40%);
            transform: translateX(-40%);
         }
      </style>
      <title>SVG</title>
      <meta charset = "utf-8" />
   </head>
   
   <body>	
      <h2 align = "center">HTML5 SVG Star</h2>
      
      <svg id = "svgelem" height = "200" xmlns = "http://www.w3.org/2000/svg">
         <polygon points = "100,10 40,180 190,60 10,60 160,180" fill = "red"/>
      </svg>
    </body>
</html>

这将在启用了 HTML5 的最新版 Firefox 中产生以下结果。

HTML5 - MathML

HTML5 的 HTML 语法允许在文档中使用 <math>...</math> 标签使用 MathML 元素。

大多数网络浏览器可以显示 MathML 标签。如果您的浏览器不支持 MathML,那么我建议您使用最新版本的 Firefox。

MathML 示例

以下是一个包含 MathML 的有效 HTML5 文档:

在线演示
<!doctype html>

<html>
   <head>
      <meta charset = "UTF-8">
      <title>Pythagorean theorem</title>
   </head>
	
   <body>
      <math xmlns = "http://www.w3.org/1998/Math/MathML">
		
         <mrow>
            <msup><mi>a</mi><mn>2</mn></msup>
            <mo>+</mo>
				
            <msup><mi>b</mi><mn>2</mn></msup>
            <mo> = </mo>
				
            <msup><mi>c</mi><mn>2</mn></msup>
         </mrow>
			
      </math>
   </body>
</html> 

这将产生以下结果:

使用 MathML 字符

考虑以下标记,它使用了字符 &InvisibleTimes;:

在线演示
<!doctype html>

<html>
   <head>
      <meta charset = "UTF-8">
      <title>MathML Examples</title>
   </head>
	
   <body>
      <math xmlns = "http://www.w3.org/1998/Math/MathML">
		
         <mrow>			
            <mrow>
				
               <msup>
                  <mi>x</mi>
                  <mn>2</mn>
               </msup>
					
               <mo>+</mo>
					
               <mrow>
                  <mn>4</mn>
                  <mo>⁢</mo>
                  <mi>x</mi>
               </mrow>
					
               <mo>+</mo>
               <mn>4</mn>
					
            </mrow>
				
            <mo>=</mo>
            <mn>0</mn>
				 
         </mrow>
      </math>
   </body>
</html> 

这将产生以下结果。如果您无法看到正确的结果,例如 x2 + 4x + 4 = 0,则使用 Firefox 3.5 或更高版本。

这将产生以下结果:

矩阵表示示例

考虑以下示例,它将用于表示一个简单的 2x2 矩阵:

在线演示
<!doctype html>

<html>
   <head>
      <meta charset = "UTF-8">
      <title>MathML Examples</title>
   </head>
	
   <body>
      <math xmlns = "http://www.w3.org/1998/Math/MathML">
		
         <mrow>
            <mi>A</mi>
            <mo>=</mo>
			
            <mfenced open = "[" close="]">
			
               <mtable>
                  <mtr>
                     <mtd><mi>x</mi></mtd>
                     <mtd><mi>y</mi></mtd>
                  </mtr>
					
                  <mtr>
                     <mtd><mi>z</mi></mtd>
                     <mtd><mi>w</mi></mtd>
                  </mtr>
               </mtable>
               
            </mfenced>
         </mrow>
      </math>

   </body>
</html> 

这将产生以下结果:

这将产生以下结果。如果您无法看到正确的结果,则使用 Firefox 3.5 或更高版本。

MathML

HTML5 - Web 存储

HTML5 引入了两种类似于 HTTP 会话 Cookie 的机制,用于在客户端存储结构化数据并克服以下缺点。

  • Cookie 包含在每个 HTTP 请求中,从而通过传输相同的数据来减慢 Web 应用程序的速度。

  • Cookie 包含在每个 HTTP 请求中,从而通过互联网发送未加密的数据。

  • Cookie 限制为大约 4 KB 的数据。不足以存储所需数据。

这两种存储分别是 会话存储本地存储,它们将用于处理不同的情况。

几乎所有浏览器的最新版本都支持 HTML5 存储,包括 Internet Explorer。

会话存储

会话存储专为用户正在执行单个事务的场景而设计,但可能同时在不同的窗口中执行多个事务。

示例

例如,如果一个用户在两个不同的窗口中使用同一个站点购买机票。如果站点使用 Cookie 来跟踪用户正在购买哪张票,那么当用户在两个窗口中从一个页面点击到另一个页面时,当前正在购买的票将从一个窗口“泄漏”到另一个窗口,这可能会导致用户在没有真正注意到的情况下购买两张同一航班的票。

HTML5 引入了 sessionStorage 属性,站点将使用该属性将数据添加到会话存储中,并且该站点在该窗口中打开的任何页面都可以访问该数据,即 会话,并且只要您关闭窗口,会话就会丢失。

以下是设置会话变量和访问该变量的代码:

在线演示
<!DOCTYPE HTML>

<html>
   <body>
      <script type = "text/javascript">
         
         if( sessionStorage.hits ) {
            sessionStorage.hits = Number(sessionStorage.hits) +1;
         } else {
            sessionStorage.hits = 1;
         }
         document.write("Total Hits :" + sessionStorage.hits );
      </script>
	
      <p>Refresh the page to increase number of hits.</p>
      <p>Close the window and open it again and check the result.</p>

   </body>
</html>

这将产生以下结果:

本地存储

本地存储专为跨越多个窗口并持续存在于当前会话之外的存储而设计。特别是,Web 应用程序可能希望出于性能原因将兆字节的用户数据(例如整个用户创作的文档或用户的邮箱)存储在客户端。

同样,Cookie 无法很好地处理这种情况,因为它们会随每个请求一起传输。

示例

HTML5 引入了 localStorage 属性,该属性将用于访问页面的本地存储区域,没有时间限制,并且只要您使用该页面,此本地存储就会可用。

以下是设置本地存储变量并在每次访问此页面时访问该变量的代码,即使下次打开窗口时也是如此:

在线演示
<!DOCTYPE HTML>

<html>
   <body>
      <script type = "text/javascript">
         
         if( localStorage.hits ) {
            localStorage.hits = Number(localStorage.hits) +1;
         } else {
            localStorage.hits = 1;
         }
         document.write("Total Hits :" + localStorage.hits );
      </script>
		
      <p>Refresh the page to increase number of hits.</p>
      <p>Close the window and open it again and check the result.</p>

   </body>
</html>

这将产生以下结果:

删除 Web 存储

在本地机器上存储敏感数据可能很危险,并且可能留下安全漏洞。

会话存储数据将在会话终止后立即由浏览器删除。

要清除本地存储设置,您需要调用 localStorage.remove('key');其中“key”是要删除的值的键。如果要清除所有设置,则需要调用 localStorage.clear() 方法。

以下是清除完整本地存储的代码:

在线演示
<!DOCTYPE HTML>

<html>
   <body>

      <script type = "text/javascript">
         localStorage.clear();

         // Reset number of hits.
         if( localStorage.hits ) {
            localStorage.hits = Number(localStorage.hits) +1;
         } else {
            localStorage.hits = 1;
         }
         document.write("Total Hits :" + localStorage.hits );
			
      </script>
		
      <p>Refreshing the page would not to increase hit counter.</p>
      <p>Close the window and open it again and check the result.</p>

   </body>
</html>

这将产生以下结果:

HTML5 - Web SQL 数据库

Web SQL 数据库 API 实际上不是 HTML5 规范的一部分,但它是一个单独的规范,它引入了一组用于使用 SQL 操作客户端数据库的 API。

我假设您是一位优秀的 Web 开发人员,如果是这样,那么毫无疑问,您会非常了解 SQL 和 RDBMS 概念。如果您仍然想与 SQL 进行交互,那么您可以查看我们的 SQL 教程

Web SQL 数据库将在最新版本的 Safari、Chrome 和 Opera 中运行。

核心方法

规范中定义了以下三种核心方法,我将在本教程中介绍:

  • openDatabase - 此方法使用现有数据库或创建新数据库来创建数据库对象。

  • transaction - 此方法使我们能够控制事务并在特定情况下执行提交或回滚。

  • executeSql - 此方法用于执行实际的 SQL 查询。

打开数据库

openDatabase 方法负责打开数据库(如果它已存在),如果它尚不存在,此方法将创建它。

要创建和打开数据库,请使用以下代码:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);

上述方法接受以下五个参数:

  • 数据库名称
  • 版本号
  • 文本描述
  • 数据库大小
  • 创建回调

最后一个和第5个参数,创建回调将在创建数据库时被调用。但是,即使没有此功能,数据库仍然可以即时创建并正确版本化。

执行查询

要执行查询,可以使用 database.transaction() 函数。此函数需要一个参数,该参数是一个函数,负责实际执行查询,如下所示:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 

db.transaction(function (tx) {   
   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); 
});

上述查询将在“mydb”数据库中创建一个名为 LOGS 的表。

INSERT 操作

要向表中创建条目,我们可以在上述示例中添加简单的 SQL 查询,如下所示:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 

db.transaction(function (tx) { 
   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); 
   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")'); 
   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")'); 
}); 

在创建条目时,我们可以传递动态值,如下所示:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);  

db.transaction(function (tx) {   
   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); 
   tx.executeSql('INSERT INTO LOGS (id,log) VALUES (?, ?'), [e_id, e_log]; 
});

这里e_ide_log 是外部变量,executeSql 将数组参数中的每个项目映射到“?”。

读取操作

要读取已存在的记录,我们使用回调来捕获结果,如下所示:

var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);  

db.transaction(function (tx) { 
   tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)');
   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")'); 
   tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")'); 
});  

db.transaction(function (tx) { 
   tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { 
      var len = results.rows.length, i; 
      msg = "<p>Found rows: " + len + "</p>"; 
      document.querySelector('#status').innerHTML +=  msg; 
  
      for (i = 0; i < len; i++) { 
         alert(results.rows.item(i).log ); 
      } 
  
   }, null); 
});

最终示例

最后,让我们将此示例保存在一个完整的 HTML5 文档中,如下所示,并尝试使用 Safari 浏览器运行它。

在线演示
<!DOCTYPE HTML> 

<html>  
   <head> 
  
      <script type = "text/javascript"> 
         var db = openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024); 
         var msg; 
    
         db.transaction(function (tx) { 
            tx.executeSql('CREATE TABLE IF NOT EXISTS LOGS (id unique, log)'); 
            tx.executeSql('INSERT INTO LOGS (id, log) VALUES (1, "foobar")'); 
            tx.executeSql('INSERT INTO LOGS (id, log) VALUES (2, "logmsg")'); 
            msg = '<p>Log message created and row inserted.</p>'; 
            document.querySelector('#status').innerHTML =  msg; 
         })

         db.transaction(function (tx) { 
            tx.executeSql('SELECT * FROM LOGS', [], function (tx, results) { 
               var len = results.rows.length, i; 
               msg = "<p>Found rows: " + len + "</p>"; 
               document.querySelector('#status').innerHTML +=  msg; 
      
               for (i = 0; i < len; i++) { 
                  msg = "<p><b>" + results.rows.item(i).log + "</b></p>"; 
                  document.querySelector('#status').innerHTML +=  msg; 
               } 
            }, null); 
         }); 
      </script> 
   </head> 
  
   <body> 
      <div id = "status" name = "status">Status Message</div> 
   </body> 
</html>

这将产生以下结果:

HTML5 - 服务器发送事件

传统的 Web 应用程序会生成事件,这些事件会被分派到 Web 服务器。例如,简单地点击链接会请求服务器上的新页面。

从 Web 浏览器流向 Web 服务器的事件类型可以称为客户端发送的事件。

除了 HTML5 之外,WHATWG Web 应用程序 1.0 引入了从 Web 服务器流向 Web 浏览器的事件,它们被称为服务器发送事件 (SSE)。使用 SSE,您可以从 Web 服务器持续地将 DOM 事件推送到访问者的浏览器。

事件流方法打开与服务器的持久连接,并在有新信息可用时将数据发送到客户端,从而无需持续轮询。

服务器发送事件标准化了我们如何将数据从服务器流式传输到客户端。

用于 SSE 的 Web 应用程序

要在 Web 应用程序中使用服务器发送事件,您需要向文档中添加一个<eventsource> 元素。

<eventsource> 元素的src 属性应指向一个 URL,该 URL 应提供一个持久 HTTP 连接,该连接发送包含事件的数据流。

该 URL 将指向一个 PHP、PERL 或任何 Python 脚本,该脚本将负责持续发送事件数据。以下是一个简单的 Web 应用程序示例,它将期望服务器时间。

<!DOCTYPE HTML>

<html>
   <head>
   
      <script type = "text/javascript">
         /* Define event handling logic here */
      </script>
   </head>
   
   <body>
      <div id = "sse">
         <eventsource src = "/cgi-bin/ticker.cgi" />
      </div>
		
      <div id = "ticker">
         <TIME>
      </div>
   </body>
</html>

用于 SSE 的服务器端脚本

服务器端脚本应发送Content-type 标头,指定类型为text/event-stream,如下所示。

print "Content-Type: text/event-stream\n\n";

设置 Content-Type 后,服务器端脚本将发送一个Event: 标记,后跟事件名称。以下示例将发送 Server-Time 作为事件名称,并以换行符结尾。

print "Event: server-time\n";

最后一步是使用Data: 标记发送事件数据,该标记后跟整数或字符串值,并以换行符结尾,如下所示:

$time = localtime();
print "Data: $time\n";

最后,以下是用 Perl 编写的完整 ticker.cgi:

#!/usr/bin/perl  
print "Content-Type: text/event-stream\n\n";  

while(true) { 
   print "Event: server-time\n"; 
   $time = localtime(); 
   print "Data: $time\n"; 
   sleep(5); 
} 

处理服务器发送事件

让我们修改我们的 Web 应用程序以处理服务器发送的事件。以下是最终示例。

<!DOCTYPE HTML> 

<html>  
   <head> 
  
      <script type = "text/javascript"> 
         document.getElementsByTagName("eventsource")[0].addEventListener("server-time", 
         eventHandler, false); 
    
         function eventHandler(event) { 

            // Alert time sent by the server 
            document.querySelector('#ticker').innerHTML = event.data; 
         } 
      </script> 
   </head> 
  
   <body> 
      <div id = "sse"> 
         <eventsource src = "/cgi-bin/ticker.cgi" /> 
      </div> 
   
      <div id = "ticker" name = "ticker"> 
         [TIME] 
      </div> 
   </body> 
</html>

在测试服务器发送事件之前,我建议您确保您的 Web 浏览器支持此概念。

HTML5 - WebSockets

WebSockets 是一种用于 Web 应用程序的下一代双向通信技术,它通过单个套接字运行,并通过 HTML 5 兼容浏览器中的 JavaScript 接口公开。

一旦您与 Web 服务器建立了 Web Socket 连接,就可以通过调用send() 方法从浏览器向服务器发送数据,并通过onmessage 事件处理程序从服务器接收数据到浏览器。

以下是创建新的 WebSocket 对象的 API。

var Socket = new WebSocket(url, [protocal] );

这里第一个参数 url 指定要连接到的 URL。第二个属性 protocol 是可选的,如果存在,则指定服务器必须支持的子协议,才能成功建立连接。

WebSocket 属性

以下是 WebSocket 对象的属性。假设我们像上面提到的那样创建了 Socket 对象:

序号 属性 & 描述
1

Socket.readyState

只读属性 readyState 表示连接的状态。它可以具有以下值:

  • 值为 0 表示连接尚未建立。

  • 值为 1 表示连接已建立并且可以进行通信。

  • 值为 2 表示连接正在经历关闭握手。

  • 值为 3 表示连接已关闭或无法打开。

2

Socket.bufferedAmount

只读属性 bufferedAmount 表示已使用 send() 方法排队的 UTF-8 文本的字节数。

WebSocket 事件

以下是与 WebSocket 对象关联的事件。假设我们像上面提到的那样创建了 Socket 对象:

事件 事件处理程序 描述
open Socket.onopen 当套接字连接建立时,会发生此事件。
message Socket.onmessage 当客户端从服务器接收数据时,会发生此事件。
error Socket.onerror 当通信中出现任何错误时,会发生此事件。
close Socket.onclose 当连接关闭时,会发生此事件。

WebSocket 方法

以下是与 WebSocket 对象关联的方法。假设我们像上面提到的那样创建了 Socket 对象:

序号 方法 & 描述
1

Socket.send()

send(data) 方法使用连接传输数据。

2

Socket.close()

close() 方法用于终止任何现有连接。

WebSocket 示例

WebSocket 是客户端和服务器之间标准的双向 TCP 套接字。套接字最初作为 HTTP 连接,然后在 HTTP 握手后“升级”为 TCP 套接字。握手后,任何一方都可以发送数据。

客户端 HTML & JavaScript 代码

在撰写本教程时,只有少数 Web 浏览器支持 WebSocket() 接口。您可以使用 Chrome、Mozilla、Opera 和 Safari 的最新版本尝试以下示例。

<!DOCTYPE HTML>

<html>
   <head>
      
      <script type = "text/javascript">
         function WebSocketTest() {
            
            if ("WebSocket" in window) {
               alert("WebSocket is supported by your Browser!");
               
               // Let us open a web socket
               var ws = new WebSocket("ws://127.0.0.1:9998/echo");
				
               ws.onopen = function() {
                  
                  // Web Socket is connected, send data using send()
                  ws.send("Message to send");
                  alert("Message is sent...");
               };
				
               ws.onmessage = function (evt) { 
                  var received_msg = evt.data;
                  alert("Message is received...");
               };
				
               ws.onclose = function() { 
                  
                  // websocket is closed.
                  alert("Connection is closed..."); 
               };
            } else {
              
               // The browser doesn't support WebSocket
               alert("WebSocket NOT supported by your Browser!");
            }
         }
      </script>
		
   </head>
   
   <body>
      <div id = "sse">
         <a href = "javascript:WebSocketTest()">Run WebSocket</a>
      </div>
      
   </body>
</html>

安装 pywebsocket

在测试上述客户端程序之前,您需要一个支持 WebSocket 的服务器。从pywebsocket下载 mod_pywebsocket-x.x.x.tar.gz,它旨在为 Apache HTTP Server 提供 Web Socket 扩展,并按照以下步骤安装它。

  • 解压缩并解压缩下载的文件。

  • 进入pywebsocket-x.x.x/src/ 目录。

  • $python setup.py build

  • $sudo python setup.py install

  • 然后通过以下方式阅读文档:

    • $pydoc mod_pywebsocket

这将将其安装到您的 Python 环境中。

启动服务器

转到pywebsocket-x.x.x/src/mod_pywebsocket 文件夹并运行以下命令:

$sudo python standalone.py -p 9998 -w ../example/

这将启动服务器并在端口 9998 上侦听,并使用 -w 选项指定的handlers 目录(我们的 echo_wsh.py 位于其中)。

现在使用 Chrome 浏览器打开您最初创建的 html 文件。如果您的浏览器支持 WebSocket(),则您将收到一个警报,指示您的浏览器支持 WebSocket,最后,当您点击“运行 WebSocket”时,您将收到服务器脚本发送的 Goodbye 消息。

HTML5 - Canvas

HTML5 元素<canvas> 为您提供了一种简单而强大的方法,可以使用 JavaScript 绘制图形。它可以用于绘制图形、制作照片合成或进行简单的(以及不太简单的)动画。

这是一个简单的<canvas> 元素,它只有两个特定的属性widthheight,以及所有核心 HTML5 属性,如 id、name 和 class 等。

<canvas id = "mycanvas" width = "100" height = "100"></canvas>

您可以使用getElementById() 方法轻松地在 DOM 中找到<canvas> 元素,如下所示:

var canvas = document.getElementById("mycanvas");

让我们看看在 HTML5 文档中使用<canvas> 元素的一个简单示例。

在线演示
<!DOCTYPE HTML>

<html>
   <head>
   
      <style>
         #mycanvas{border:1px solid red;}
      </style>
   </head>
   
   <body>
      <canvas id = "mycanvas" width = "100" height = "100"></canvas>
   </body>
</html>

这将产生以下结果:

渲染上下文

<canvas> 最初是空白的,要显示某些内容,脚本首先需要访问渲染上下文并在其上绘制。

canvas 元素有一个名为getContext 的 DOM 方法,用于获取渲染上下文及其绘图函数。此函数接受一个参数,即上下文类型2d

以下是获取所需上下文的代码,以及检查您的浏览器是否支持<canvas> 元素:

var canvas  = document.getElementById("mycanvas");

if (canvas.getContext) {   
   var ctx = canvas.getContext('2d');   
   // drawing code here   
} else {   
   
   // canvas-unsupported code here 
}  

浏览器支持

Firefox、Safari、Chrome 和 Opera 的最新版本都支持 HTML5 Canvas,但 IE8 本身不支持 canvas。

您可以使用ExplorerCanvas 通过 Internet Explorer 获得 canvas 支持。您只需要包含以下 JavaScript 代码:

<!--[if IE]><script src = "excanvas.js"></script><![endif]-->

HTML5 Canvas 示例

本教程涵盖了与 HTML5 <canvas> 元素相关的以下示例。

序号 示例 & 描述
1 绘制矩形

了解如何使用 HTML5 <canvas> 元素绘制矩形

2 绘制路径

了解如何在 HTML5 <canvas> 元素中使用路径制作形状

3 绘制线条

了解如何使用 HTML5 <canvas> 元素绘制线条

4 绘制贝塞尔曲线

了解如何使用 HTML5 <canvas> 元素绘制贝塞尔曲线

5 绘制二次曲线

了解如何使用 HTML5 <canvas> 元素绘制二次曲线

6 使用图像

了解如何在 HTML5 <canvas> 元素中使用图像

7 创建渐变

了解如何使用 HTML5 <canvas> 元素创建渐变

8 样式和颜色

了解如何使用 HTML5 <canvas> 元素应用样式和颜色

9 文本和字体

了解如何使用不同的字体及其大小绘制令人惊叹的文本。

10 图案和阴影

了解如何绘制不同的图案和投影。

11 画布状态

了解如何在画布上进行复杂绘制时保存和恢复画布状态。

12 画布平移

此方法用于将画布及其原点移动到网格中的不同点。

13 画布旋转

此方法用于围绕当前原点旋转画布。

14 画布缩放

此方法用于增加或减少画布网格中的单位。

15 画布变换

这些方法允许直接修改变换矩阵。

16 画布合成

此方法用于屏蔽某些区域或清除画布中的部分区域。

17 画布动画

了解如何使用 HTML5 canvas 和 JavaScript 创建基本动画。

HTML5 - 音频和视频

HTML5 功能包括原生音频和视频支持,无需 Flash。

HTML5 的<audio> 和<video> 标签使向网站添加媒体变得简单。您需要设置src 属性以识别媒体源,并包含 controls 属性,以便用户可以播放和暂停媒体。

嵌入视频

以下是在网页中嵌入视频文件的最简单形式:

<video src = "foo.mp4"  width = "300" height = "200" controls>
   Your browser does not support the <video> element.   
</video>

当前的 HTML5 草案规范未指定浏览器在 video 标签中应支持哪些视频格式。但最常用的视频格式是:

  • Ogg - 带有 Thedora 视频编解码器和 Vorbis 音频编解码器的 Ogg 文件。

  • mpeg4 - 带有 H.264 视频编解码器和 AAC 音频编解码器的 MPEG4 文件。

您可以使用<source> 标签指定媒体以及媒体类型和许多其他属性。video 元素允许使用多个 source 元素,浏览器将使用第一个识别的格式:

在线演示
<!DOCTYPE HTML>

<html>
   <body>
      
      <video  width = "300" height = "200" controls autoplay>
         <source src = "/html5/foo.ogg" type ="video/ogg" />
         <source src = "/html5/foo.mp4" type = "video/mp4" />
         Your browser does not support the <video> element.
      </video>
      
   </body>
</html>

这将产生以下结果:

视频属性规范

HTML5 video 标签可以具有许多属性来控制控件的外观和感觉以及各种功能:

序号 属性 & 描述
1

autoplay

如果指定了此布尔属性,则视频将在能够播放时立即开始播放,而不会停止加载数据。

2

autobuffer

如果指定了此布尔属性,则即使未将其设置为自动播放,视频也会自动开始缓冲。

3

controls

如果存在此属性,则允许用户控制视频播放,包括音量、查找和暂停/恢复播放。

4

height

此属性以 CSS 像素指定视频显示区域的高度。

5

loop

如果指定了此布尔属性,则允许视频在到达末尾后自动跳转回开头。

6

preload

此属性指定视频将在页面加载时加载,并准备运行。如果存在 autoplay,则忽略。

7

poster

这是在用户播放或查找之前显示的图像的 URL。

8

src

要嵌入的视频的 URL。这是可选的;您也可以在视频块内使用 <source> 元素来指定要嵌入的视频。

9

width

此属性以 CSS 像素指定视频显示区域的宽度。

嵌入音频

HTML5 支持 <audio> 标签,用于在 HTML 或 XHTML 文档中嵌入声音内容,如下所示。

<audio src = "foo.wav" controls autoplay>
   Your browser does not support the <audio> element.   
</audio>

当前的 HTML5 草案规范未指定浏览器应在 audio 标签中支持哪些音频格式。但最常用的音频格式是 ogg、mp3wav

您可以使用 <source&ggt; 标签来指定媒体以及媒体类型和许多其他属性。音频元素允许使用多个 source 元素,浏览器将使用第一个识别的格式 -

在线演示
<!DOCTYPE HTML>

<html>
   <body>
      
      <audio controls autoplay>
         <source src = "/html5/audio.ogg" type = "audio/ogg" />
         <source src = "/html5/audio.wav" type = "audio/wav" />
         Your browser does not support the <audio> element.
      </audio>
      
   </body>
</html>

这将产生以下结果:

音频属性规范

HTML5 audio 标签可以具有一些属性来控制控件的外观和感觉以及各种功能 -

序号 属性 & 描述
1

autoplay

如果指定了此布尔属性,则音频将在能够播放时立即开始播放,而不会停止加载数据。

2

autobuffer

如果指定了此布尔属性,则即使未将其设置为自动播放,音频也会自动开始缓冲。

3

controls

如果存在此属性,则允许用户控制音频播放,包括音量、查找和暂停/恢复播放。

4

loop

如果指定了此布尔属性,则允许音频在到达末尾后自动跳转回开头。

5

preload

此属性指定音频将在页面加载时加载,并准备运行。如果存在 autoplay,则忽略。

6

src

要嵌入的音频的 URL。这是可选的;您也可以在视频块内使用 <source> 元素来指定要嵌入的视频。

处理媒体事件

HTML5 audio 和 video 标签可以具有一些属性,可以使用 JavaScript 控制控件的各种功能 -

序号 事件和描述
1

abort

当播放被中止时,会生成此事件。

2

canplay

当有足够的数据可供播放媒体时,会生成此事件。

3

ended

当播放完成时,会生成此事件。

4

error

当发生错误时,会生成此事件。

5

loadeddata

当媒体的第一帧加载完成时,会生成此事件。

6

loadstart

当媒体的加载开始时,会生成此事件。

7

pause

当播放暂停时,会生成此事件。

8

play

当播放开始或恢复时,会生成此事件。

9

progress

定期生成此事件以通知媒体下载的进度。

10

ratechange

当播放速度更改时,会生成此事件。

11

seeked

当查找操作完成时,会生成此事件。

12

seeking

当查找操作开始时,会生成此事件。

13

suspend

当媒体的加载被暂停时,会生成此事件。

14

volumechange

当音频音量更改时,会生成此事件。

15

waiting

当请求的操作(如播放)被延迟,等待另一个操作(如查找)完成时,会生成此事件。

以下示例允许播放给定的视频 -

在线演示
<!DOCTYPE HTML>

<html>
   <head>
   
      <script type = "text/javascript">
         function PlayVideo() {
            var v = document.getElementsByTagName("video")[0];  
            v.play(); 
         }
      </script>
   </head>
   
   <body>
   
      <form>         
         <video width = "300" height = "200" src = "/html5/foo.mp4">
         Your browser does not support the video element.
         </video>
         <br />
         <input type = "button" onclick = "PlayVideo();" value = "Play"/>
      </form>
      
   </body>
</html>

这将产生以下结果:

配置服务器以匹配媒体类型

大多数服务器默认情况下不会使用正确的 MIME 类型提供 Ogg 或 mp4 媒体,因此您可能需要为此添加相应的配置。

AddType audio/ogg .oga
AddType audio/wav .wav
AddType video/ogg .ogv .ogg
AddType video/mp4 .mp4

HTML5 - 地理位置

HTML5 Geolocation API 允许您与您喜欢的网站共享您的位置。JavaScript 可以捕获您的纬度和经度,并可以发送到后端 Web 服务器,并执行诸如查找本地企业或在地图上显示您的位置等高级位置感知操作。

如今,大多数浏览器和移动设备都支持 Geolocation API。地理位置 API 与全局 navigator 对象的新属性即 Geolocation 对象一起使用,可以按如下方式创建 -

var geolocation = navigator.geolocation;

geolocation 对象是一个服务对象,允许小部件检索有关设备地理位置的信息。

Geolocation 方法

geolocation 对象提供以下方法 -

序号 方法 & 描述
1 getCurrentPosition()

此方法检索用户的当前地理位置。

2 watchPosition()

此方法检索有关设备当前地理位置的定期更新。

3 clearWatch()

此方法取消正在进行的 watchPosition 调用。

示例

以下是一个使用上述任何方法的示例代码 -

function getLocation() {
   var geolocation = navigator.geolocation;
   geolocation.getCurrentPosition(showLocation, errorHandler);
}

此处,showLocation 和 errorHandler 是回调方法,将用于获取实际位置(如下一节所述)以及处理任何错误。

位置属性

Geolocation 方法 getCurrentPosition() 和 getPositionUsingMethodName() 指定检索位置信息的回调方法。这些方法与一个对象 Position 异步调用,该对象存储完整的位置信息。

Position 对象指定设备的当前地理位置。位置表示为一组地理坐标以及有关航向和速度的信息。

下表描述了 Position 对象的属性。对于可选属性,如果系统无法提供值,则该属性的值设置为 null。

属性 类型 描述
coords 对象 指定设备的地理位置。位置表示为一组地理坐标以及有关航向和速度的信息。
coords.latitude 数字 以十进制度数指定纬度估计值。值范围为 [-90.00,+90.00]。
coords.longitude 数字 以十进制度数指定经度估计值。值范围为 [-180.00,+180.00]。
coords.altitude 数字 [可选] 以米为单位指定高于 WGS 84 参考椭球面的高度估计值。
coords.accuracy 数字 [可选] 以米为单位指定纬度和经度估计值的精度。
coords.altitudeAccuracy 数字 [可选] 以米为单位指定高度估计值的精度。
coords.heading 数字 [可选] 以度为单位指定设备当前运动方向,相对于正北方向顺时针计算。
coords.speed 数字 [可选] 以米/秒为单位指定设备当前的地面速度。
timestamp date 指定检索位置信息和创建 Position 对象的时间。

示例

以下是一个使用 Position 对象的示例代码。此处,showLocation 方法是一个回调方法 -

function showLocation( position ) {
   var latitude = position.coords.latitude;
   var longitude = position.coords.longitude;
   ...
}

处理错误

Geolocation 比较复杂,并且非常需要捕获任何错误并优雅地处理它。

geolocations 方法 getCurrentPosition() 和 watchPosition() 使用一个错误处理程序回调方法,该方法提供 PositionError 对象。此对象具有以下两个属性 -

属性 类型 描述
code 数字 包含错误的数字代码。
message 字符串 包含错误的人类可读描述。

下表描述了 PositionError 对象中返回的可能的错误代码。

代码 常量 描述
0 UNKNOWN_ERROR 由于未知错误,该方法无法检索设备的位置。
1 PERMISSION_DENIED 该方法无法检索设备的位置,因为应用程序没有权限使用位置服务。
2 POSITION_UNAVAILABLE 无法确定设备的位置。
3 TIMEOUT 该方法无法在指定的最大超时间隔内检索位置信息。

示例

以下是一个使用 PositionError 对象的示例代码。此处,errorHandler 方法是一个回调方法 -

function errorHandler( err ) {
   
   if (err.code == 1) {
      
      // access is denied
   }
   ...
}

位置选项

以下是 getCurrentPosition() 方法的实际语法 -

getCurrentPosition(callback, ErrorCallback, options)

此处,第三个参数是 PositionOptions 对象,它指定了一组用于检索设备地理位置的选项。

以下是可以作为第三个参数指定的选项 -

属性 类型 描述
enableHighAccuracy 布尔值 指定小部件是否希望接收尽可能准确的位置估计。默认情况下,此值为 false。
timeout 数字 timeout 属性是您的 Web 应用程序愿意等待位置的毫秒数。
maximumAge 数字 指定缓存位置信息的过期时间(以毫秒为单位)。

示例

以下是一个示例代码,展示了如何使用上述方法 -

function getLocation() {
   var geolocation = navigator.geolocation;
   geolocation.getCurrentPosition(showLocation, errorHandler, {maximumAge: 75000});
}

HTML5 - 微数据

微数据是在您的网页中提供额外语义的标准化方法。

微数据允许您定义自己的自定义元素,并开始在您的网页中嵌入自定义属性。从高层次来看,微数据由一组名称-值对组成。

这些组称为 项目,每个名称-值对都是一个 属性。项目和属性由常规元素表示。

示例

  • 要创建项目,使用 itemscope 属性。

  • 要向项目添加属性,在项目的某个后代元素上使用 itemprop 属性。

这里有两个项目,每个项目都有属性“name” -

在线演示
<html>
   <body>
      
      <div itemscope>
         <p>My name is <span itemprop = "name">Zara</span>.</p>
      </div>
      
      <div itemscope>
         <p>My name is <span itemprop = "name">Nuha</span>.</p>
      </div>
      
   </body>
</html>

它将产生以下结果 -

属性通常具有字符串值,但它可以具有以下数据类型 -

全局属性

微数据引入了五个全局属性,这些属性可供任何元素使用,并为机器提供有关您的数据上下文。

序号 属性 & 描述
1

itemscope

这用于创建项目。itemscope 属性是一个布尔属性,表示此页面上有微数据,并且这是它的起始位置。

2

itemtype

此属性是一个有效的 URL,它定义了项目并为属性提供了上下文。

3

itemid

此属性是项目的全局标识符。

4

itemprop

此属性定义了项目的属性。

5

itemref

此属性提供了一个其他元素列表,用于爬取以查找项目的名称-值对。

属性数据类型

属性通常具有字符串值,如上述示例中所述,但它们也可以具有 URL 值。以下示例具有一项属性“image”,其值为 URL:

<div itemscope>
   <img itemprop = "image" src = "tp-logo.gif" alt = "TutorialsPoint">
</div>

属性还可以具有日期、时间或日期和时间的值。这是通过使用time元素及其datetime属性实现的。

在线演示
<html>
   <body>
      
      <div itemscope>
         My birthday is:
         <time itemprop = "birthday" datetime = "1971-05-08">
            Aug 5th 1971
         </time>
      </div>
      
   </body>
</html>

它将产生以下结果 -

属性本身也可以是名称-值对的组,方法是在声明属性的元素上放置itemscope属性。

Microdata API 支持

如果浏览器支持 HTML5 microdata API,则全局文档对象上将存在一个getItems()函数。如果浏览器不支持 microdata,则getItems()函数将未定义。

function supports_microdata_api() {
   return !!document.getItems;
}

Modernizr 尚未支持检查 microdata API,因此您需要使用上面列出的类似函数。

HTML5 microdata 标准包括 HTML 标记(主要用于搜索引擎)和一组 DOM 函数(主要用于浏览器)。

您可以在网页中包含 microdata 标记,而不理解 microdata 属性的搜索引擎只会忽略它们。但是,如果您需要通过 DOM 访问或操作 microdata,则需要检查浏览器是否支持 microdata DOM API。

定义 Microdata 词汇表

要定义 microdata 词汇表,您需要一个指向工作网页的命名空间 URL。例如,https://data-vocabulary.org/Person 可用作具有以下命名属性的个人 microdata 词汇表的命名空间:

  • name - 作为简单字符串的人名

  • Photo - 指向该人物图片的 URL。

  • URL - 属于该人物的网站。

使用 about 属性,人物 microdata 可以如下所示:

在线演示
<html>
   <body>
   
      <div itemscope>
         <section itemscope itemtype = "http://data-vocabulary.org/Person">
            <h1 itemprop = "name">Gopal K Varma</h1>
         
            <p>
               <img itemprop = "photo" 
                  src = "https://tutorialspoint.com/green/images/logo.png">
            </p>
            
            <a itemprop = "url" href = "#">Site</a>
         </section>
      </div>
      
   </body>
</html>

它将产生以下结果 -

Google 支持 microdata 作为其富片段程序的一部分。当 Google 的网络爬虫解析您的页面并找到符合 http://datavocabulary.org/Person 词汇表的 microdata 属性时,它会解析这些属性并将其与页面数据的其余部分一起存储。

您可以使用富片段测试工具使用 https://tutorialspoint.com/html5/microdata.htm 测试上述示例。

有关 Microdata 的进一步开发,您始终可以参考HTML5 Microdata

HTML5 - 拖放

拖放 (DnD) 是一种强大的用户界面概念,它可以借助鼠标点击轻松复制、重新排序和删除项目。这允许用户点击并按住鼠标按钮,将其拖动到另一个位置,然后释放鼠标按钮以将元素放置在那里。

为了使用传统的 HTML4 实现拖放功能,开发人员要么必须使用复杂的 JavaScript 编程,要么必须使用其他 JavaScript 框架,例如 jQuery 等。

现在 HTML 5 推出了拖放 (DnD) API,该 API 为浏览器带来了原生 DnD 支持,从而使编码变得更加容易。

Chrome、Firefox 3.5 和 Safari 4 等所有主要浏览器都支持 HTML 5 DnD。

拖放事件

在拖放操作的各个阶段会触发许多事件。这些事件列在下面:

序号 事件和描述
1

dragstart

当用户开始拖动对象时触发。

2

dragenter

当鼠标在拖动过程中首次移到目标元素上时触发。此事件的侦听器应指示是否允许在此位置放置。如果没有侦听器,或者侦听器不执行任何操作,则默认情况下不允许放置。

3

dragover

当拖动过程中鼠标移到元素上时,会触发此事件。大多数情况下,侦听器期间发生的操作将与 dragenter 事件相同。

4

dragleave

当鼠标在拖动过程中离开元素时,会触发此事件。侦听器应删除用于放置反馈的任何突出显示或插入标记。

5

drag

每次拖动对象时移动鼠标都会触发。

6

drop

在拖动操作结束时,在发生放置的元素上触发 drop 事件。侦听器将负责检索正在拖动的对象并将其插入放置位置。

7

dragend

当用户在拖动对象时释放鼠标按钮时触发。

注意 - 请注意,仅触发拖动事件;在拖动操作期间不会触发鼠标事件,例如mousemove

DataTransfer 对象

所有拖放事件的事件侦听器方法都接受Event对象,该对象具有一个名为dataTransfer的只读属性。

event.dataTransfer返回与事件关联的DataTransfer对象,如下所示:

function EnterHandler(event) {
   DataTransfer dt = event.dataTransfer;
   .............
}

DataTransfer对象保存有关拖放操作的信息。可以根据与 DataTransfer 对象关联的各种属性检索和设置此数据,如下所述:

序号 DataTransfer 属性及其描述
1

dataTransfer.dropEffect [ = value ]

  • 返回当前选定的操作类型。

  • 可以设置此属性以更改选定的操作。

  • 可能的值为 none、copy、link 和 move。

2

dataTransfer.effectAllowed [ = value ]

  • 返回要允许的操作类型。

  • 可以设置此属性以更改允许的操作。

  • 可能的值为none、copy、copyLink、copyMove、link、linkMove、move、alluninitialized

3

dataTransfer.types

返回一个 DOMStringList,其中列出了在 dragstart 事件中设置的格式。此外,如果正在拖动任何文件,则其中一个类型将是字符串“Files”。

4

dataTransfer.clearData ( [ format ] )

删除指定格式的数据。如果省略参数,则删除所有数据。

5

dataTransfer.setData(format, data)

添加指定的数据。

6

data = dataTransfer.getData(format)

返回指定的数据。如果没有此类数据,则返回空字符串。

7

dataTransfer.files

返回正在拖动的文件的 FileList(如果有)。

8

dataTransfer.setDragImage(element, x, y)

使用给定的元素更新拖动反馈,替换任何先前指定的反馈。

9

dataTransfer.addElement(element)

将给定的元素添加到用于呈现拖动反馈的元素列表中。

拖放过程

以下是实现拖放操作的步骤:

步骤 1 - 使对象可拖动

以下是需要采取的步骤:

  • 如果要拖动元素,则需要为该元素将draggable属性设置为true

  • dragstart设置一个事件侦听器,以存储正在拖动的对象。

  • 事件侦听器dragstart将设置允许的效果(复制、移动、链接或某些组合)。

以下是如何使对象可拖动的示例:

在线演示
<!DOCTYPE HTML>

<html>
   <head>
      
      <style type = "text/css">
         
         #boxA, #boxB {
            float:left;padding:10px;margin:10px; -moz-user-select:none;
         }
         #boxA { background-color: #6633FF; width:75px; height:75px;  }
         #boxB { background-color: #FF6699; width:150px; height:150px; }
      </style>
      
      <script type = "text/javascript">
         
         function dragStart(ev) {
            ev.dataTransfer.effectAllowed = 'move';
            ev.dataTransfer.setData("Text", ev.target.getAttribute('id'));
            ev.dataTransfer.setDragImage(ev.target,0,0);
            
            return true;
         }
      </script>
      
   </head>
   <body>
      
      <center>
         <h2>Drag and drop HTML5 demo</h2>
         <div>Try to drag the purple box around.</div>
         
         <div id = "boxA" draggable = "true" 
            ondragstart = "return dragStart(ev)">
            <p>Drag Me</p>
         </div>
         
         <div id = "boxB">Dustbin</div>
      </center>
      
   </body>
</html>

这将产生以下结果:

步骤 2 - 放置对象

要接受放置,放置目标必须至少侦听三个事件。

  • dragenter事件,用于确定放置目标是否要接受放置。如果要接受放置,则必须取消此事件。

  • dragover事件,用于确定要向用户显示什么反馈。如果事件被取消,则基于 dropEffect 属性的值更新反馈(通常是光标)。

  • 最后,drop事件,允许执行实际的放置。

以下是将对象放置到另一个对象中的示例:

在线演示
<html>
   <head>
      <style type="text/css">
         #boxA, #boxB {
            float:left;padding:10px;margin:10px;-moz-user-select:none;
         }
         #boxA { background-color: #6633FF; width:75px; height:75px;  }
         #boxB { background-color: #FF6699; width:150px; height:150px; }
      </style>
      <script type="text/javascript">
         function dragStart(ev) {
            ev.dataTransfer.effectAllowed='move';
            ev.dataTransfer.setData("Text", ev.target.getAttribute('id'));
            ev.dataTransfer.setDragImage(ev.target,0,0);
            return true;
         }
         function dragEnter(ev) {
            event.preventDefault();
            return true;
         }
         function dragOver(ev) {
            return false;
         }
         function dragDrop(ev) {
            var src = ev.dataTransfer.getData("Text");
            ev.target.appendChild(document.getElementById(src));
            ev.stopPropagation();
            return false;
         }
      </script>
   </head>
   <body>
      <center>
         <h2>Drag and drop HTML5 demo</h2>
         <div>Try to move the purple box into the pink box.</div>
         <div id="boxA" draggable="true" ondragstart="return dragStart(event)">
            <p>Drag Me</p>
         </div>
         <div id="boxB" ondragenter="return dragEnter(event)" ondrop="return dragDrop(event)" ondragover="return dragOver(event)">Dustbin</div>
      </center>
   </body>
</html>

这将产生以下结果:

HTML5 - Web Workers

JavaScript 旨在在单线程环境中运行,这意味着多个脚本不能同时运行。考虑这样一种情况,您需要处理 UI 事件、查询和处理大量 API 数据以及操作 DOM。

在 CPU 利用率很高的情况下,JavaScript 会挂起您的浏览器。让我们来看一个简单的示例,其中 JavaScript 遍历一个大循环:

在线演示
<!DOCTYPE HTML>

<html>
   <head>
      <title>Big for loop</title>
      
      <script>
         function bigLoop() {
            
            for (var i = 0; i <= 10000; i += 1) {
               var j = i;
            }
            alert("Completed " + j + "iterations" );
         }
         
         function sayHello(){
            alert("Hello sir...." );
         }
      </script>
      
   </head>
   
   <body>
      <input type = "button" onclick = "bigLoop();" value = "Big Loop" />
      <input type = "button" onclick = "sayHello();" value = "Say Hello" />
   </body>
</html>

它将产生以下结果 -

当您点击 Big Loop 按钮时,它将在 Firefox 中显示以下结果:

Big Loop

什么是 Web Workers?

上面解释的情况可以使用Web Workers来处理,Web Workers 将执行所有计算量大的任务,而不会中断用户界面,并且通常在单独的线程上运行。

Web Workers 允许长时间运行的脚本不会被响应点击或其他用户交互的脚本中断,并允许执行长时间任务而不会屈服以保持页面响应。

Web Workers 是后台脚本,它们相对重量级,并且不打算大量使用。例如,为四百万像素图像的每个像素启动一个工作线程是不合适的。

当脚本在 Web Worker 内部执行时,它无法访问网页的窗口对象 (window.document),这意味着 Web Workers 无法直接访问网页和 DOM API。尽管 Web Workers 不会阻塞浏览器 UI,但它们仍然可以消耗 CPU 周期并降低系统响应速度。

Web Workers 如何工作?

Web Workers 使用 JavaScript 文件的 URL 初始化,该文件包含工作线程将执行的代码。此代码设置事件侦听器并与从主页面生成它的脚本进行通信。以下是简单的语法:

var worker = new Worker('bigLoop.js');

如果指定的文件存在,浏览器将生成一个新的工作线程,该线程将异步下载。如果 worker 的路径返回 404 错误,则 worker 将静默失败。

如果您的应用程序有多个支持的 JavaScript 文件,您可以导入它们importScripts()方法,该方法将文件名作为参数,并用逗号分隔,如下所示:

importScripts("helper.js", "anotherHelper.js");

一旦生成 Web Worker,Web Worker 与其父页面之间的通信将通过postMessage()方法完成。根据您的浏览器/版本,postMessage()可以接受字符串或 JSON 对象作为其唯一参数。

Web Worker 传递的消息使用主页面中的onmessage事件访问。现在让我们使用 Web Worker 编写我们的 bigLoop 示例。下面是主页面 (hello.htm),它将生成一个 web worker 来执行循环并返回变量j的最终值:

在线演示
<!DOCTYPE HTML>

<html>
   <head>
      <title>Big for loop</title>
      
      <script>
         var worker = new Worker('bigLoop.js');
         
         worker.onmessage = function (event) {
            alert("Completed " + event.data + "iterations" );
         };
         
         function sayHello() {
            alert("Hello sir...." );
         }
      </script>
   </head>
   
   <body>
      <input type = "button" onclick = "sayHello();" value = "Say Hello"/>
   </body>
</html>

以下是bigLoop.js文件的内容。它利用了postMessage() API将通信传递回主页面。

for (var i = 0; i <= 1000000000; i += 1) {
   var j = i;
}
postMessage(j);

这将产生以下结果:

停止Web Workers

Web Workers不会自动停止,但启动它们的页面可以通过调用terminate()方法来停止它们。

worker.terminate();

终止的Web Worker将不再响应消息或执行任何其他计算。您无法重新启动一个worker;相反,您可以使用相同的URL创建一个新的worker。

处理错误

以下显示了Web Worker JavaScript文件中错误处理函数的示例,该函数将错误记录到控制台。使用错误处理代码,上面的示例将变为如下所示:

<!DOCTYPE HTML>

<html>
   <head>
      <title>Big for loop</title>
      
      <script>
         var worker = new Worker('bigLoop.js');
         
         worker.onmessage = function (event) {
            alert("Completed " + event.data + "iterations" );
         };
         
         worker.onerror = function (event) {
            console.log(event.message, event);
         };
         
         function sayHello() {
            alert("Hello sir...." );
         }
      </script>
   </head>
   
   <body>
      <input type = "button" onclick = "sayHello();" value = "Say Hello"/>
   </body>
</html>

检查浏览器支持

以下是检测浏览器中是否支持Web Worker功能的语法:

在线演示
<!DOCTYPE HTML>

<html>
   <head>
      <title>Big for loop</title>
      <script src = "/js/modernizr-1.5.min.js"></script>
      
      <script>
      function myFunction() {
         
         if (Modernizr.webworkers) {
            alert("Congratulation!! you have web workers support." );
         } else {
            alert("Sorry!! you do not have web workers support." );
         }
      }
      </script>
   </head>
   
   <body>
      <button onclick = "myFunction()">Click me</button>
   </body>
</html>

这将产生以下结果:

HTML5 - IndexedDB

IndexedDB是HTML5中一个新的概念,用于将数据存储在用户的浏览器中。IndexedDB比本地存储更强大,适用于需要存储大量数据的应用程序。这些应用程序可以运行得更高效,加载速度更快。

为什么要使用IndexedDB?

W3C已宣布Web SQL数据库是一个已弃用的本地存储规范,因此Web开发人员不应再使用此技术。IndexedDB是Web SQL数据库的替代方案,并且比旧技术更有效。

特性

  • 它存储键值对。
  • 它不是关系型数据库。
  • IndexedDB API大多是异步的。
  • 它没有使用结构化查询语言。
  • 它支持访问同一域中的数据。

IndexedDB

在进入IndexedDB之前,我们需要添加一些实现的前缀,如下所示:

window.indexedDB = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || 
window.msIndexedDB;
 
window.IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction || 
window.msIDBTransaction;
window.IDBKeyRange = window.IDBKeyRange || 
window.webkitIDBKeyRange || window.msIDBKeyRange
 
if (!window.indexedDB) {
   window.alert("Your browser doesn't support a stable version of IndexedDB.")
}

打开一个IndexedDB数据库

在创建数据库之前,我们必须为数据库准备一些数据。让我们从公司员工详细信息开始。

const employeeData = [
   { id: "01", name: "Gopal K Varma", age: 35, email: "[email protected]" },
   { id: "02", name: "Prasad", age: 24, email: "[email protected]" }
];

添加数据

这里手动向数据中添加一些数据,如下所示:

function add() {
   var request = db.transaction(["employee"], "readwrite")
   .objectStore("employee")
   .add({ id: "01", name: "prasad", age: 24, email: "[email protected]" });
   
   request.onsuccess = function(event) {
      alert("Prasad has been added to your database.");
   };
   
   request.onerror = function(event) {
      alert("Unable to add data\r\nPrasad is already exist in your database! ");
   }
}

检索数据

我们可以使用get()从数据库中检索数据。

function read() {
   var transaction = db.transaction(["employee"]);
   var objectStore = transaction.objectStore("employee");
   var request = objectStore.get("00-03");
   
   request.onerror = function(event) {
      alert("Unable to retrieve daa from database!");
   };
   
   request.onsuccess = function(event) {
      
      if(request.result) {
         alert("Name: " + request.result.name + ", Age: 
            " + request.result.age + ", Email: " + request.result.email);
      } else {
         alert("Kenny couldn't be found in your database!");  
      }
   };
}

使用get(),我们可以将数据存储在对象中,而不是将其存储在游标中,并且我们可以从游标中检索数据。

function readAll() {
   var objectStore = db.transaction("employee").objectStore("employee");
   
   objectStore.openCursor().onsuccess = function(event) {
      var cursor = event.target.result;
      
      if (cursor) {
         alert("Name for id " + cursor.key + " is " + cursor.value.name + ", 
            Age: " + cursor.value.age + ", Email: " + cursor.value.email);
         cursor.continue();
      } else {
         alert("No more entries!");
      }
   };
}

删除数据

我们可以使用remove()从IndexedDB中删除数据。代码如下所示:

function remove() {
   var request = db.transaction(["employee"], "readwrite")
   .objectStore("employee")
   .delete("02");
   
   request.onsuccess = function(event) {
      alert("prasad entry has been removed from your database.");
   };
}

HTML代码

为了显示所有数据,我们需要使用onClick事件,如下面的代码所示:

<!DOCTYPE html>

<html>
   <head>
      <meta http-equiv = "Content-Type" content = "text/html; charset = utf-8" />
      <title>IndexedDb Demo | onlyWebPro.com</title>
   </head>
   
   <body>
      <button onclick = "read()">Read </button>
      <button onclick = "readAll()"></button>
      <button onclick = "add()"></button>
      <button onclick = "remove()">Delete </button>
   </body>
</html>

最终代码应为:

<!DOCTYPE html>

<html>
   <head>
      <meta http-equiv = "Content-Type" content = "text/html; charset = utf-8" />
      <script type = "text/javascript">
         
         //prefixes of implementation that we want to test
         window.indexedDB = window.indexedDB || window.mozIndexedDB || 
         window.webkitIndexedDB || window.msIndexedDB;
         
         //prefixes of window.IDB objects
         window.IDBTransaction = window.IDBTransaction || 
         window.webkitIDBTransaction || window.msIDBTransaction;
         window.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange || 
         window.msIDBKeyRange
         
         if (!window.indexedDB) {
            window.alert("Your browser doesn't support a stable version of IndexedDB.")
         }
         
         const employeeData = [
            { id: "00-01", name: "gopal", age: 35, email: "[email protected]" },
            { id: "00-02", name: "prasad", age: 32, email: "[email protected]" }
         ];
         var db;
         var request = window.indexedDB.open("newDatabase", 1);
         
         request.onerror = function(event) {
            console.log("error: ");
         };
         
         request.onsuccess = function(event) {
            db = request.result;
            console.log("success: "+ db);
         };
         
         request.onupgradeneeded = function(event) {
            var db = event.target.result;
            var objectStore = db.createObjectStore("employee", {keyPath: "id"});
            
            for (var i in employeeData) {
               objectStore.add(employeeData[i]);
            }
         }
         
         function read() {
            var transaction = db.transaction(["employee"]);
            var objectStore = transaction.objectStore("employee");
            var request = objectStore.get("00-03");
            
            request.onerror = function(event) {
               alert("Unable to retrieve daa from database!");
            };
            
            request.onsuccess = function(event) {
               // Do something with the request.result!
               if(request.result) {
                  alert("Name: " + request.result.name + ", 
                     Age: " + request.result.age + ", Email: " + request.result.email);
               } else {
                  alert("Kenny couldn't be found in your database!");
               }
            };
         }
         
         function readAll() {
            var objectStore = db.transaction("employee").objectStore("employee");
            
            objectStore.openCursor().onsuccess = function(event) {
               var cursor = event.target.result;
               
               if (cursor) {
                  alert("Name for id " + cursor.key + " is " + cursor.value.name + ", 
                     Age: " + cursor.value.age + ", Email: " + cursor.value.email);
                  cursor.continue();
               } else {
                  alert("No more entries!");
               }
            };
         }
         
         function add() {
            var request = db.transaction(["employee"], "readwrite")
            .objectStore("employee")
            .add({ id: "00-03", name: "Kenny", age: 19, email: "[email protected]" });
            
            request.onsuccess = function(event) {
               alert("Kenny has been added to your database.");
            };
            
            request.onerror = function(event) {
               alert("Unable to add data\r\nKenny is aready exist in your database! ");
            }
         }
         
         function remove() {
            var request = db.transaction(["employee"], "readwrite")
            .objectStore("employee")
            .delete("00-03");
            
            request.onsuccess = function(event) {
               alert("Kenny's entry has been removed from your database.");
            };
         }
      </script>
      
   </head>
   <body>
      <button onclick = "read()">Read </button>
      <button onclick = "readAll()">Read all </button>
      <button onclick = "add()">Add data </button>
      <button onclick = "remove()">Delete data </button>
   </body>
</html>

它将产生以下输出:

HTML5 - Web消息传递

Web消息传递是指从服务器向客户端浏览器发送实时消息的能力。它克服了不同域、协议或端口之间跨域通信的问题。

例如,您希望将数据从您的页面发送到放置在iframe中的广告容器,反之亦然,在这种情况下,浏览器会抛出一个安全异常。使用Web消息传递,我们可以将数据作为消息事件传递。

消息事件

消息事件触发跨文档消息传递、通道消息传递、服务器发送事件和WebSocket。它由消息事件接口描述。

属性

序号 属性和描述
1

data

包含字符串数据。

2

origin

包含域名和端口。

3

lastEventId

包含当前消息事件的唯一标识符。

4

source

包含对源文档窗口的引用。

5

ports

包含任何消息端口发送的数据。

发送跨文档消息

在发送跨文档消息之前,我们需要创建一个新的Web浏览上下文,方法是创建新的iframe或新窗口。我们可以使用postMessage()发送数据,它有两个参数。它们分别是:

  • message - 要发送的消息。
  • targetOrigin - 源名称。

示例

从iframe发送消息到按钮。

var iframe = document.querySelector('iframe');
var button = document.querySelector('button');

var clickHandler = function() {
   iframe.contentWindow.postMessage('The message to send.',
      'https://tutorialspoint.com);
}
button.addEventListener('click',clickHandler,false);

在接收文档中接收跨文档消息。

var messageEventHandler = function(event){
   
   // check that the origin is one we want.
   if(event.origin == 'https://tutorialspoint.com') {
      alert(event.data);
   }
}
window.addEventListener('message', messageEventHandler,false);

通道消息传递

浏览上下文之间的双向通信称为通道消息传递。它对于跨多个源进行通信很有用。

MessageChannel和MessagePort对象

在创建MessageChannel时,它会在内部创建两个端口来发送数据并转发到另一个浏览上下文。

  • postMessage() - 通过通道发布消息。

  • start() - 它发送数据。

  • close() - 它关闭端口。

在这种情况下,我们正在从一个iframe发送数据到另一个iframe。在这里,我们调用函数中的数据并将数据传递给DOM。

var loadHandler = function() {
   var mc, portMessageHandler;
   mc = new MessageChannel();
   window.parent.postMessage('documentAHasLoaded','http://foo.example',[mc.port2]);
   
   portMessageHandler = function(portMsgEvent) {
      alert( portMsgEvent.data );
   }
   
   mc.port1.addEventListener('message', portMessageHandler, false);
   mc.port1.start();
}
window.addEventListener('DOMContentLoaded', loadHandler, false);

上面的代码从端口2获取数据,现在它将数据传递到第二个iframe。

var loadHandler = function() {
   var iframes, messageHandler;
   iframes = window.frames;
   
   messageHandler = function(messageEvent) {
      
      if( messageEvent.ports.length > 0 ) {
         
         // transfer the port to iframe[1]
         iframes[1].postMessage('portopen','http://foo.example',messageEvent.ports);
      }
   }
   window.addEventListener('message',messageHandler,false);
}
window.addEventListener('DOMContentLoaded',loadHandler,false);

现在第二个文档使用portMsgHandler函数处理数据。

var loadHandler() {
   
   // Define our message handler function
   var messageHandler = function(messageEvent) {
   
      // Our form submission handler
      
      var formHandler = function() {
         var msg = 'add <[email protected]> to game circle.';
         messageEvent.ports[0].postMessage(msg);
      }
      document.forms[0].addEventListener('submit',formHandler,false);
   }
   window.addEventListener('message',messageHandler,false);
}
window.addEventListener('DOMContentLoaded',loadHandler,false);

HTML5 - CORS

跨源资源共享(CORS)是一种机制,允许Web浏览器访问另一个域中的受限资源。

例如,如果您在HTML5演示部分中点击了HTML5-视频播放器,它将请求摄像头权限。如果用户允许权限,则它才会打开摄像头,否则它不会为Web应用程序打开摄像头。

发出CORS请求

这里Chrome、Firefox、Opera和Safari都使用XMLHttprequest2对象,而Internet Explorer使用类似的XDomainRequest对象。

function createCORSRequest(method, url) {
   var xhr = new XMLHttpRequest();
   
   if ("withCredentials" in xhr) {
      
      // Check if the XMLHttpRequest object has a "withCredentials" property.
      // "withCredentials" only exists on XMLHTTPRequest2 objects.
      xhr.open(method, url, true);
   } else if (typeof XDomainRequest != "undefined") {
      
      // Otherwise, check if XDomainRequest.
      // XDomainRequest only exists in IE, and is IE's way of making CORS requests.
      xhr = new XDomainRequest();
      xhr.open(method, url);
   } else {
      
      // Otherwise, CORS is not supported by the browser.
      xhr = null;
   }
   return xhr;
}

var xhr = createCORSRequest('GET', url);

if (!xhr) {
   throw new Error('CORS not supported');
}

CORS中的事件处理程序

序号 事件处理程序和描述
1

onloadstart

开始请求。

2

onprogress

加载数据并发送数据。

3

onabort

中止请求。

4

onerror

请求失败。

5

onload

请求成功加载。

6

ontimeout

在请求完成之前发生超时。

7

onloadend

请求完成时,无论成功还是失败。

onload或onerror事件示例

xhr.onload = function() {
   var responseText = xhr.responseText;
   
   // process the response.
   console.log(responseText);
};

xhr.onerror = function() {
   console.log('There was an error!');
};

带有处理程序的CORS示例

以下示例将显示makeCorsRequest()和onload处理程序的示例。

// Create the XHR object.
function createCORSRequest(method, url) {
   var xhr = new XMLHttpRequest();
   
   if ("withCredentials" in xhr) {
      
      // XHR for Chrome/Firefox/Opera/Safari.
      xhr.open(method, url, true);
   } else if (typeof XDomainRequest != "undefined") {
      
      // XDomainRequest for IE.
      xhr = new XDomainRequest();
      xhr.open(method, url);
   } else {
      
      // CORS not supported.
      xhr = null;
   }
   return xhr;
}

// Helper method to parse the title tag from the response.
function getTitle(text) {
   return text.match('<title>(.*)?</title>')[1];
}

// Make the actual CORS request.
function makeCorsRequest() {
   
   // All HTML5 Rocks properties support CORS.
   var url = 'https://tutorialspoint.com';
   
   var xhr = createCORSRequest('GET', url);
   
   if (!xhr) {
      alert('CORS not supported');
      return;
   }
   
   // Response handlers.
   xhr.onload = function() {
      var text = xhr.responseText;
      var title = getTitle(text);
      alert('Response from CORS request to ' + url + ': ' + title);
   };
   
   xhr.onerror = function() {
      alert('Woops, there was an error making the request.');
   };
   xhr.send();
}

HTML5 - Web RTC

WebRTC由万维网联盟(W3C)引入。它支持浏览器到浏览器应用程序进行语音通话、视频聊天和P2P文件共享。

如果您想尝试一下?WebRTC适用于Chrome、Opera和Firefox。WebRTC实现了三个API,如下所示:

  • MediaStream - 访问用户的摄像头和麦克风。

  • RTCPeerConnection - 访问音频或视频通话功能。

  • RTCDataChannel - 访问点对点通信。

MediaStream

MediaStream表示媒体的同步流,例如,在HTML5演示部分中点击HTML5视频播放器,或者点击这里

上面的示例包含stream.getAudioTracks()和stream.VideoTracks()。如果没有音频轨道,它将返回一个空数组,它将检查视频流,如果网络摄像头已连接,stream.getVideoTracks()将返回一个包含一个MediaStreamTrack的数组,该数组表示来自网络摄像头的流。一个简单的例子是聊天应用程序,聊天应用程序从网络摄像头、后置摄像头、麦克风获取流。

MediaStream的示例代码

function gotStream(stream) {
   window.AudioContext = window.AudioContext || window.webkitAudioContext;
   var audioContext = new AudioContext();
   
   // Create an AudioNode from the stream
   var mediaStreamSource = audioContext.createMediaStreamSource(stream);
   
   // Connect it to destination to hear yourself
   // or any other node for processing!
   mediaStreamSource.connect(audioContext.destination);
}
navigator.getUserMedia({audio:true}, gotStream);

屏幕截图

在Chrome浏览器中也可以使用mediaStreamSource,并且需要HTTPS。此功能在Opera中尚不可用。

会话控制、网络和媒体信息

WebRTC需要浏览器之间的点对点通信。此机制需要信令、网络信息、会话控制和媒体信息。Web开发人员可以选择不同的机制在浏览器之间进行通信,例如SIP或XMPP或任何双向通信。

createSignalingChannel()的示例代码

var signalingChannel = createSignalingChannel();
var pc;
var configuration = ...;

// run start(true) to initiate a call
function start(isCaller) {
   pc = new RTCPeerConnection(configuration);
   
   // send any ice candidates to the other peer
   pc.onicecandidate = function (evt) {
      signalingChannel.send(JSON.stringify({ "candidate": evt.candidate }));
   };
   
   // once remote stream arrives, show it in the remote video element
   pc.onaddstream = function (evt) {
      remoteView.src = URL.createObjectURL(evt.stream);
   };
   
   // get the local stream, show it in the local video element and send it
   navigator.getUserMedia({ "audio": true, "video": true }, function (stream) {
      selfView.src = URL.createObjectURL(stream);
      pc.addStream(stream);
      
      if (isCaller)
         pc.createOffer(gotDescription);
      
      else
         pc.createAnswer(pc.remoteDescription, gotDescription);
         
         function gotDescription(desc) {
            pc.setLocalDescription(desc);
            signalingChannel.send(JSON.stringify({ "sdp": desc }));
         }
      });
   }
   
   signalingChannel.onmessage = function (evt) {
      if (!pc)
         start(false);
         var signal = JSON.parse(evt.data);
      
      if (signal.sdp)
         pc.setRemoteDescription(new RTCSessionDescription(signal.sdp));
      
      else
         pc.addIceCandidate(new RTCIceCandidate(signal.candidate));
};
广告