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.tw/html">HTML Tutorial</a></li> 
            <li><a href = "https://tutorialspoint.tw/css">CSS Tutorial</a></li> 
            <li><a href = "https://tutorialspoint.tw/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.tw/">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@example.com格式僅輸入電子郵件地址。

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@example.com"/>
         <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://: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.tw/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.tw/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: "contact@tutorialspoint.com" },
   { id: "02", name: "Prasad", age: 24, email: "prasad@tutorialspoint.com" }
];

新增資料

這裡手動向資料中新增一些資料,如下所示:

function add() {
   var request = db.transaction(["employee"], "readwrite")
   .objectStore("employee")
   .add({ id: "01", name: "prasad", age: 24, email: "prasad@tutorialspoint.com" });
   
   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: "gopal@tutorialspoint.com" },
            { id: "00-02", name: "prasad", age: 32, email: "prasad@tutorialspoint.com" }
         ];
         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: "kenny@planet.org" });
            
            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.tw);
}
button.addEventListener('click',clickHandler,false);

在接收文件中接收跨文件訊息。

var messageEventHandler = function(event){
   
   // check that the origin is one we want.
   if(event.origin == 'https://tutorialspoint.tw') {
      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 <foo@example.com> 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.tw';
   
   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));
};
廣告