精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于HTML5 Widget Dojo開發教程

移動開發
本文通過例子介紹了基于 HTML5 的 Dojo Widget 的設計思想和實現方式,利用 HTML5 中的 Canvas 特性和 Dojo 的 Widget 機制創建了一個對話框 Widget。

HTML5 Widget Dojo開發教程是本文要介紹的內容,相較于傳統的基于 HTML4 和 CSS2 的 Widget 設計和實現,基于 HTML5 技術的 Widget 具有很多天然的優勢和良好的特性。雖然現階段 HTML5 尚未得到廣泛的支持,但相信市場對 HTML5 中各種新特性的需求會驅動 HTML5 的迅速普及,屆時會有各種基于 HTML5 功能的 Widget 出來,將我們的頁面裝飾的更加豐富多彩。

當前的 Web 開發存在著兩種趨勢,一是基于 HTML、CSS 和 JavaScript 技術,比如以 Dojo 工具包、jQuery 等為基礎的 HTML 頁面;另一種是基于瀏覽器端運行時,如基于 Flash、Silverlight 等技術的 RIA 應用。前者占用的資源少,不需在瀏覽器上安裝插件支持,后者界面更為美觀,且便于實現一些較為復雜的展現功能。而且,因為 JavaScript 和 Flash 等平臺之間的交互功能很受局限,基于這兩類技術開發的頁面內容很難做深度的集成。

HTML5 作為新一代的 HTML 標準,不但對 JavaScript 的支持更加完善,同時還包含了豐富的繪圖功能,這等同于兼具上面提到的兩類技術的各自的優勢。本文主要介紹基于 HTML5 來擴展 Dojo Widget,它不僅具有強大的 JavaScript 邏輯控制,而且具有豐富的頁面展現和良好的運行性能。

若干年前,很少有人會想到一家生產電腦的公司會憑借一款功能設計上存在著不少缺陷的手機在市場上取得巨大的成功。也很少有人會想到一家曾經占據著智能手機大部分市場份額的廠商會落入今天這樣舉步維艱的局面。人們不禁驚訝的發現,精美的界面、方便的操作對于消費者的吸引力要大于完善的功能及穩定的系統。用戶體驗的優劣在一定的程度上決定了一個面向終端用戶的產品能否在市場上生存。移動設備的設計如此,互聯網應用的設計亦如此?,F在,互聯網上充斥著各種精美的 CSS 式樣、JavaScript 特效、Flash 動畫等等,來吸引大眾的眼球以獲得更多的用戶關注和經濟收益。這其中存在著兩種流行的設計趨勢。

一種是以高級的 JavaScript 技術和 CSS 技術為基礎的 DHTML,以此來實現美觀和交互性強的用戶界面。這種技術的優勢是瀏覽器能夠提供天然的支持而不依賴于任何插件而且能夠很靈活的訪問頁面上的內容,但是這種技術的不足是瀏覽器自身的局限使得一些功能實現起來很困難。比如若要實現網頁上的矢量繪圖,雖然有 VML、SVG 等技術,但是它們不是廣泛支持的標準,需要在不同的瀏覽器上做不同的處理。

另一種是在瀏覽器上面安裝某種包含運行環境的插件來運行某些 RIA 的應用,如 Flash、Silverlight、JavaFX 等,這些技術都是基于矢量繪圖,能夠呈現絢麗的用戶界面和靈活多變的用戶交互。但它們的缺點就是需要在瀏覽器上再安裝插件,而且運行效率往往也會存在著一定的問題。

新一代的 Web 頁面標準 HTML5 則可以幫助我們很好的解決這一問題,它不但提供了很多諸如 Web 套接字、Web 存儲等技術,而且提供了 Canvas 以便在 Web 頁面上直接進行矢量繪圖。作為 HTML5 標準的一部分,Canvas 將天然地被各種瀏覽器支持,而且便于與 JavaScript 進行交互。從某種意義上說可以作為當前流行的 Flash 技術的替代品。所以,HTML5 與 Flash 技術孰優孰劣的爭論這兩年就一直不斷。

現在 Web 前端開發領域流行著不少 JavaScript 類庫,如 YUI Library、Ext JS、Dojo Toolkit 等,其中一些封裝了各種前端控件。這些控件的實現是基于 HTML4 的標準和復雜的 JavaScript 及 CSS 技術。但隨著 HTML5 技術的發展,它的各種強大特性為這些控件的結構和功能提供新的設計和實現方式。因此,如何將 HTML5 的特性靈活的運用到前端控件開發就是本文的關注點。由于 HTML5 的特性很多,而流行性的 JavaScript 庫中的前端控件也五花八門,本文只能舉例說明。讀者可以根據自身的需求結合 HTML5 中的特性開發出各種強大的前端頁面控件。

#p#

新一代 Web 標準 HTML5

HTML5 是新一代的 HTML 標準,它里面包含了很多 HTML4 中沒有的新標簽和應用程序接口,如 audio 標簽、video 標簽、矢量繪圖、Web 套接字、離線數據存儲等。這些新特性可以使 Web 頁面具有更豐富的功能和更好的用戶體驗,其中的很多都可以用在網頁控件設計上,從而使得網頁上的內容更加豐富。

在 HTML5 眾多的功能中,有一個功能非常重要,它不僅是一項被眾多網頁設計人員期待已久的功能,而且為網頁的功能和外觀設計留下了巨大的空間,它就是 HTML5 中的矢量繪圖。現在,不僅不少的業內人士將 HTML5 的矢量繪圖視作 Flash 的挑戰者,甚至連 Flash 的支持廠商 Adobe 都推出了基于 HTML5 矢量繪圖的動畫制作工具。本文后面將會介紹借助 HTML5 的矢量繪圖技術實現 Dojo Widget

在此之前,為了幫助讀者能夠更好的理解本文的內容,這里先對 HTML 中的矢量繪圖做一些簡要的說明。HTML5 的矢量繪圖的功能由 Canvas 標簽和各種繪圖 API 構成。在 JavaScript 的腳本中,通過 Canvas 節點可以獲得繪圖上下文,通過它調用 API 就可以繪制各種矢量圖,如下所示。

清單 1. 利用 HTML5 Canvas 繪制的矩形和三角形

  1. <html>   
  2.   <head>   
  3.      <script>   
  4.         window.onload = function() {   
  5.            var canvas = document.getElementById('canvas1');   
  6.            var ctx = canvas.getContext('2d');   
  7.            ctx.fillRect(25,25,100,100);   
  8.            ctx.clearRect(45,45,60,60);   
  9.            ctx.strokeRect(50,50,50,50);   
  10.            ctx.beginPath();   
  11.            ctx.moveTo(125,125);   
  12.            ctx.lineTo(205,125);   
  13.            ctx.lineTo(125,205);   
  14.            ctx.fill();   
  15.         }   
  16.      </script>   
  17.   </head>   
  18.   <body>   
  19.      <canvas id="canvas1" height="600" width="600">   
  20.      </canvas>   
  21.   </body>   
  22. </html>  

基于HTML5 Widget Dojo開發教程

圖 1. HTML5 的 Canvas 繪制的矩形和三角形

在上面的例子中,我們在一個 HTML 的文檔中加入了一個 Canvas 標簽,利用基于 JavaScript 的 API 來獲得繪圖上下文(Context),并在上面繪制了我們所要的圖形。除了繪制 2D 圖形,HTML5 還支持 3D 矢量繪圖,它與 2D 的使用方式類似,此處不再詳述。

值得注意的是,HTML5 還是一個發展的標準,至今并沒有被所有主流瀏覽器全面支持。但是,即使是曾經是對 HTML5 支持較少的 IE 瀏覽器也會在新版本 IE9 中支持 Canvas 繪圖等 HTML5 關鍵標簽技術。所以相信在不久的將來,HTML5 的普及就會實現。

Dojo Widget

近些年,頁面設計的易用性、功能性和交互性已經成為了業界的主流趨勢。網頁的功能越來越豐富,用戶體驗也越來越舒適。這一切都離不開前端以 JavaScript 和 CSS 為基礎的 DHTML 技術的迅猛發展。但是,前端大規模的 JavaScript 和 CSS 開發的復雜度比較高,而且還要支持不同的瀏覽器平臺,于是誕生了很多 JavaScript 庫用來幫助前端開發者完成較為復雜的頁面邏輯同時屏蔽瀏覽器的差異,如 jQuery、YUI Library、Ext JS 等。

另外,越來越多的互聯網公司也將自己的 JavaScript 庫發布出來,如淘寶的 KISSY、豆瓣的 Do 等等。每種庫都支持封裝前端復雜的控件,如 jQurey UI、Dojo Widget 等,但方式卻不相同。

本文選取 Dojo Toolkit 作為控件實現的基礎來介紹基于 HTML5 的控件的設計思想,當然,這種設計并不是只能在 Dojo Toolkit 上得到實現,其它的類庫也可以作為實現基礎。Dojo Toolkit 是當前頁面前端開發領域流行的 DHTML 庫,它不但包括豐富的頁面基礎功能,如 CSS 選擇器、DOM 節點操作、動畫效果等,還包括良好的面向對象的封裝結構和以此為基礎的 Dojo 控件技術 Dojo Widget(簡稱 Dijit)。Dojo Widget 中包含了對網頁控件的生命周期管理,包括初始化渲染、屬性映射、事件綁定、控件銷毀等。清單 2 中給出了一個簡單的 Dojo Widget 的實現。

清單 2. 一個簡單的 Dojo Widget

  1. dojo.declare("com.shy.widget.MyWidget", [dijit._Widget, dijit._Templated] ,{   
  2.   templateString : "<div dojoAttachEvent=\"onclick:onClick\">${text}</div>",   
  3.   text : "",   
  4.   onClick : function() {alert('onClick');}   
  5. });  

清單 2 定義的 Dojo Widget 會在頁面上生成一個 DIV 標簽并將屬性 text 的值作為 DIV 中的內容。同時,一個 onclick 事件響應被綁定到這個 DIV 上。

Dojo Widget 的使用有兩種方法:一種是通過 HTML 標記的方式將 Dojo Widget 添加到頁面上;另一種是通過類型實例化的方式來初始化一個實例。清單 3 和清單 4 分別給出了這兩種方法各自的例子。

清單 3. 通過 HTML 標記的方式使用 Dojo Widget

  1. <div dojoType="com.shy.widget.MyWidget" text="Hello World" />  

清單 4. 通過類型實例化的方式使用 Dojo Widget

  1. <div id="testNode" />   
  2.  <script type="text/JavaScript" >   
  3.    var myWidget = new com.shy.widget.MyWidget({text:'Hello World'},      
  4.    document.getElementById("testNode"));   
  5.  </script>  

在一般的基于 Dojo 的工程項目中,除了 Dojo 自身提供的各式 Widget,開發人員會根據實際項目需要擴展 Dojo 提供的 Widget 或是重新開發新的 Widget。我們在后面的內容里將會在 Dojo Widget 框架的基礎上,利用 HTML5 的非凡特性來實現新的 Widget。

#p#

基于 HTML5 的 Dojo Widget 的設計

如前文所述,HTML5 中包含了很多強大的特性,它們的普及和發展會給前端頁面的控件技術帶來巨大的變化。本文不去描繪這種改變將會是什么樣子,而是舉一個具體的例子來為讀者掀開未來的一角并由讀者親身品位。HTML5 中的很多特性都可以用于頁面控件功能的實現,如前文提到的 Web 套接字、離線存儲、拖拽、矢量繪圖等。本文將利用 HTML5 中的 Canvas 矢量繪圖來渲染 Dojo Widget 的視圖,并在此基礎上設計了屬性映射和事件綁定。

當前,很多網站的頁面都會在適當地方彈出一些對話框,圖 2 所示是 Google maps 網站上的對話框,圖 3 所示的是騰訊的 Web QQ 網站上的對話框。一般來講,網頁上的對話框都是通過 DIV 或是 Table 來進行布局。有的設計力求簡潔,如圖 2 中的對話框,只用一層 DIV 表示外框;有的設計則力求美觀,如圖 3 中的對話框,用了 9 個 DIV 來描述外框。頁面上的對話框的外觀設計的關鍵是邊框的設計。

以往的技術,如圖 2 和圖 3 都是利用 DIV 加一些式樣和背景圖片來實現對話框。但 HTML5 中的 canvas 給了我們另外一種實現頁面上控件外觀的手段,就是用矢量圖將對話框的邊框“畫”出來,而不是通過 DIV“拼”出來。這樣可以利用矢量圖技術來為對話框增加各種新特性,比如對話框的陰影、圓角、漸變等各種效果,再比如特殊形狀的對話框,如橢圓形,菱形等等。

此外,利用矢量繪圖技術去“畫”對話框的另一個好處就是可以很方便的調整大小和形狀。例如要求設計一個橢圓形的對話框并且可以設置尺寸,如果沒有矢量繪圖,或許還可以用橢圓背景圖片來實現,但設置大小的需求就很難實現。所以 HTML5 中的矢量繪圖確實能為頁面前端控件的外觀設計帶來靈活性。我們這里會用 HTML5 的 Canvas 實現對話框控件。

基于HTML5 Widget Dojo開發教程

圖 2. Google Maps 網站上彈出的對話框

基于HTML5 Widget Dojo開發教程

圖 3. 騰訊的 Web QQ 網站上的彈出對話框
 
利用 HTML5 我們可以畫出圖 4 所示的對話框的外觀,包括標題欄和主體兩部分,在標題欄的右側還有一個關閉按鈕。與上面例子中的對話框類似,我們也會使用兩個 DIV 分別作為標題欄內容和主體內容的容器。得到的對話框 Widget 結構上會由三部分組成,分別是:繪制對話框外觀的 Canvas、包含標題內容的 DIV 和包含主體內容的 DIV。

基于HTML5 Widget Dojo開發教程

圖 4. HTML5 Canvas 上畫出的對話框外觀

設計好對話框 Widget 的外觀和結構后,接下來需要考慮如何為它綁定事件。圖 2 和圖 3 中的對話框中的每一個組成部分都是一個或幾個 HTML 元素,換句話說就是可以對應到頁面上的一個或幾個 DOM 節點。比如 Google Maps 和騰訊 Web QQ 網站上的對話框中的關閉按鈕都是 Anchor 元素,其所對應的 DOM 節點上可以直接綁定事件處理函數。但是,對于圖 4 中的那個關閉按鈕,則不能通過簡單的 DOM 節點事件綁定來完成。

為 Canvas 矢量圖上的某個區域進行事件綁定,如為圖 4 中的關閉按鈕添加事件響應,需要首先監聽 Canvas 節點的相應事件,再在事件處理函數中進行事件分發。同樣以圖 4 中的關閉按鈕為例,要監聽它的鼠標點擊事件,需要監聽 Canvas 的鼠標點擊事件,在其回調函數中計算鼠標的坐標是否落入了關閉按鈕的區域內,若是則調用關閉按鈕的事件點擊處理函數。

對于 Widget 外觀矢量圖上表示出的嵌套關系,如圖 4 中的外層對話框包含里面的關閉按鈕,更好的實踐是將矢量圖上的內容分成不同的實體進行封裝,如可將外層對話框和里面的關閉按鈕封裝成不同的組件,這樣整個對話框就變成了一個組合控件。這種組合關就可以用樹的結構來進行描述,并以此設計類似瀏覽器 DOM 樹上的事件捕獲和冒泡機制,如圖 5 所示。因為 HTML5 的 Canvas 的矢量繪圖不允許將事件響應綁定到矢量圖中的某個具體圖形上,所以圖 5 中 Widget3 的鼠標單擊事件處理需要從 Canvas 的鼠標單件事件處理中逐級分發,在事件分發的過程中加入事件捕獲和事件冒泡的響應。

基于HTML5 Widget Dojo開發教程

圖 5. 組合模式的 Widget 的事件捕獲和冒泡
 
在 Canvas 上設計好 Widget 的外觀后,就可以將其包裝到 Dojo Widget 中,然后按照清單 3 和清單 4 中給出的方式來使用它。

#p#

基于 HTML5 的 Dojo Widget 的實現

做為一個提供良好面向對象封裝的 JavaScript 類庫,Dojo Toolkit 提供了完善的 Widget 封裝機制用于創建各種控件,如 Dijit 中的 Form 表單控件、布局控件,Dojox 中的表格控件、顏色選項板控件等。這些控件實現的功能千差萬別,卻遵循同樣的結構,可見 Dojo 所提供的 Widget 機制具有十分良好的適用性。

一般來講,每一個 Dojo Widget 都要繼承 Dojo 中兩個抽象類 dijit._Widget 和 dijit_Templated 并實現其中的一些方法。dijit_Widget 主要用于實現 Dojo Widget 的生命周期管理,dijit._Templated 用于實現 Widget 的視圖渲染和屬性映射,對于我們所要實現的 Widget 也會繼承這兩個接口。我們的 Widget 的視圖主要有三部分組成,一個 Canvas 節點用于繪制外觀,一個 DIV 節點用于容納標題內容,一個 DIV 節點用于容納主體內容,Canvas 節點中的矢量圖作為兩個 DIV 節點的背景。整個 Widget 的結構如圖 6 所示。

基于HTML5 Widget Dojo開發教程

圖 6. 所要實現的 Widget 的結構

在實現 Widget 結構的同時,利用 Dojo 提供的模板的機制,可以輕松的將屬性設置反映到視圖上。Widget 的結構定義和屬性定義如清單 5 所示。

清單 5. 所實現的 Widget 的結構和屬性定義

  1. dojo.declare("com.shy.widget.DemoWidget",[dijit._Widget,dijit._Templated], {   
  2.  
  3. templateString : "  
  4. <div  style='position:relative;'> 
  5. <canvas dojoAttachPoint='canvasNode' height='${height}' width='${width}'   
  6. style='position:absolute' ></canvas> 
  7. <div dojoAttachPoint='titleNode'   
  8. style='position:absolute;top:10px;left:12px;'></div> 
  9. <div dojoAttachPoint='containerNode' style='position:absolute;  
  10. top:40px;left:12px;overflow:auto'></div> 
  11. </div>",   
  12.   width : 200,   
  13.   height: 150,   
  14.   dialogTitle : "",   
  15. });  

清單 5 中的 canvas 節點標記是 HTML5 中的新特性,利用 Canvas 我們可以繪制如圖 4 所示的矢量圖作為 Widget 的背景?;?Dojo 所提供的 Widget 生命周期的機制,重載 dijit._Widget 的 postCreate 方法在里面繪制矢量圖并調整一些結構式樣,矢量圖繪制的具體實現會在后面完整的 Widget 程序清單中給出。

清單 6. 實現 Widget 的 postCreate 方法

  1. dojo.declare("com.shy.widget.DemoWidget",[dijit._Widget,dijit._Templated], {   
  2.   templateString :   
  3.    <div  style='position:relative;'> 
  4.    <canvas dojoAttachPoint='canvasNode' height='${height}' width='${width}'   
  5.    style='position:absolute' ></canvas> 
  6.    <div dojoAttachPoint='titleNode'   
  7.    style='position:absolute;top:10px;left:12px;'></div> 
  8.    <div dojoAttachPoint='containerNode' style='position:absolute;  
  9.    top:40px;left:12px;overflow:auto'></div> 
  10.    </div>",   
  11.  
  12.   width : 200,   
  13.  
  14.   height: 150,   
  15.  
  16.   dialogTitle : "",   
  17.  
  18.   postCreate : function() {   
  19.      this._drawDialog(this.width, this.height, this.canvasNode);   
  20.      this.inherited(arguments);   
  21.      dojo.style(this.titleNode, "height", 20 + "px");   
  22.      dojo.style(this.titleNode, "width", (this.width - 54) + "px");   
  23.      dojo.style(this.containerNode, "width", (this.width - 30) + "px");   
  24.      dojo.style(this.containerNode, "height", (this.height - 60) + "px");   
  25.      this.titleNode.innerHTML = '<font color=white>' + this.dialogTitle + '</font>';   
  26.   },   
  27. });  

上面實現了 Widget 的視圖,接下來我們要為它綁定兩個事件響應。首先是對話框 Widget 的鼠標拖動,即為對話框 Widget 標題欄添加拖放功能。為了實現這個功能可在 canvas 的鼠標事件響應中進行處理,判斷事件觸發點是否落在標題欄的位置上并處理。另外,也可以直接在標題欄 DIV 節點上綁定事件處理??紤]到實現上的簡單,我們采用第二種方式,將 Dojo 提供的拖放功能直接綁定到標題欄 DIV 節點上。

然后是對話框的關閉按鈕響應,即通過對話框上的關閉按鈕來關閉對話框。實現這個功能只能通過在 canvas 的鼠標事件響應中判斷觸發點位置的方式。清單 7 中的完整的 Widget 代碼就是在清單 6 的基礎上添加了事件響應的內容并實現了矢量繪圖的函數功能。

清單 7. Widget 的完整實現

  1. dojo.declare("com.shy.widget.DemoWidget",[dijit._Widget,dijit._Templated], {   
  2.  
  3.   templateString :  
  4.   <div  style='position:relative;'> 
  5.    <canvas dojoAttachPoint='canvasNode' height='${height}' width='${width}'   
  6.    style='position:absolute' ></canvas> 
  7.    <div dojoAttachPoint='titleNode'   
  8.    style='position:absolute;top:10px;left:12px;'></div> 
  9.    <div dojoAttachPoint='containerNode' style='position:absolute;  
  10.    top:40px;left:12px;overflow:auto'></div> 
  11.    </div>",   
  12.  
  13.   width : 200,   
  14.  
  15.   height: 150,   
  16.  
  17.   dialogTitle : "",   
  18.  
  19.   onClickListeners : [],   
  20.  
  21.   postCreate : function() {   
  22.      this._drawDialog(this.width, this.height, this.canvasNode);   
  23.      new dojo.dnd.Moveable(this.domNode, {handle:this.titleNode});   
  24.      this.inherited(arguments);   
  25.      dojo.style(this.titleNode, "height", 20 + "px");   
  26.      dojo.style(this.titleNode, "width", (this.width - 54) + "px");   
  27.      dojo.style(this.containerNode, "width", (this.width - 30) + "px");   
  28.      dojo.style(this.containerNode, "height", (this.height - 60) + "px");   
  29.      this.titleNode.innerHTML = '<font color=white>' + this.dialogTitle + '</font>';   
  30.   },   
  31.  
  32.   _onCanvasClick : function(e) {   
  33.      for(var i = 0; i < this.onClickListeners.length; i ++) {   
  34.         if(this.onClickListeners[i].isInScope(e.layerX, e.layerY)) {   
  35.            this[this.onClickListeners[i].handler]();   
  36.         }   
  37.      }   
  38.   },   
  39.  
  40.   _onClose : function() {   
  41.      this.hide();   
  42.   },   
  43.  
  44.   show : function() {   
  45.      dojo.style(this.domNode, "display", "block");   
  46.   },   
  47.  
  48.   hide : function() {   
  49.      dojo.style(this.domNode, "display", "none");   
  50.   },   
  51.  
  52.   _drawDialog : function(width, height, canvasNode) {   
  53.      var canvas = canvasNode;   
  54.      var ctx = canvas.getContext('2d');   
  55.      ctx.beginPath();   
  56.      ctx.shadowOffsetX = 4;   
  57.      ctx.shadowOffsetY = 4;   
  58.      ctx.shadowBlur = 8;   
  59.      ctx.lineWidth = 7;   
  60.      ctx.strokeStyle = '#fff';   
  61.      ctx.shadowColor = 'rgba(0, 0, 0, 0.25)';   
  62.      ctx.fillStyle = 'rgba(0, 0, 0, 0.5)';   
  63.      drawBody(ctx,7,7,width - 20,height - 20,15);   
  64.      drawCloseButton(ctx, width - 20 - 10, 20);   
  65.      this.onClickListeners.push({isInScope: function(x, y){  
  66.      return (x - width + 20 + 10) * (x - width + 20 + 10) + (y - 20) * (y - 20) < 49 },   
  67.      handler: "_onClose"});   
  68.  
  69.      function drawBody(ctx,x,y,width,height,radius) {   
  70.         drawRoundedRect(ctx,x,y,width,height,radius);   
  71.         ctx.fill();   
  72.         ctx.fillStyle='#fff';   
  73.         ctx.strokeStyle = '#fff';   
  74.         ctx.shadowOffsetX = 0;   
  75.         ctx.shadowOffsetY = 4;   
  76.         ctx.shadowBlur = 8;   
  77.         ctx.lineWidth   = 3;   
  78.         ctx.beginPath();   
  79.         ctx.moveTo(x,35);   
  80.         ctx.lineTo(x + width,35);   
  81.         ctx.closePath();   
  82.         ctx.stroke();   
  83.      }   
  84.  
  85.  
  86.      function drawRoundedRect(ctx,x,y,width,height,radius){   
  87.         ctx.beginPath();   
  88.         ctx.moveTo(x,y+radius);   
  89.         ctx.lineTo(x,y+height-radius);   
  90.         ctx.quadraticCurveTo(x,y+height,x+radius,y+height);   
  91.         ctx.lineTo(x+width-radius,y+height);   
  92.         ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);   
  93.         ctx.lineTo(x+width,y+radius);   
  94.         ctx.quadraticCurveTo(x+width,y,x+width-radius,y);   
  95.         ctx.lineTo(x+radius,y);   
  96.         ctx.quadraticCurveTo(x,y,x,y+radius);   
  97.         ctx.stroke();   
  98.      }   
  99.  
  100.      function drawCloseButton(ctx, x, y) {   
  101.         ctx.fillStyle="#ff0000";   
  102.         ctx.lineWidth   = 3;   
  103.         ctx.beginPath();   
  104.         ctx.arc(x, y, 7, 0, Math.PI*2, true);   
  105.         ctx.closePath();   
  106.         ctx.stroke();   
  107.         ctx.strokeStyle = '#ff0000';   
  108.         ctx.beginPath();   
  109.         ctx.moveTo(x - 5 * 0.707, y - 5 * 0.707);   
  110.         ctx.lineTo(x + 5 * 0.707, y + 5 * 0.707);   
  111.         ctx.moveTo(x - 5 * 0.707, y + 5 * 0.707);   
  112.         ctx.lineTo(x + 5 * 0.707, y - 5 * 0.707);   
  113.         ctx.closePath();   
  114.         ctx.stroke();   
  115.      }   
  116.   }   
  117. });  

#p#

基于 HTML5 的 Dojo Widget 的應用

在上面的小節中,我們介紹了對話框 Dojo Widget 的實現。對于這樣的 Dojo Widget,前面介紹過可以通過兩種方式來使用,一種是通過 HTML 標記的方式,另外一種是通過類型實例化的方式。對話框 Widget 是一個容器控件,可以在包含其它的 Widget 或是 HTML 標記在里面。清單 8 給出了在 HTML 頁面上通過標記的方式使用對話框 Widget 的例子。

清單 8. 在 HTML 頁面中使用對話框 Widget

  1. <div dojoType="com.shy.widget.DemoWidget"  width="260" height="220"   
  2. dialogTitle="I am title" >   
  3.   <input id="text1" dojoType="dijit.form.TextBox"  value="shaoyu"></input>   
  4.   <button id="button1" dojoType="dijit.form.Button" >Submit</button>   
  5. </div>  

清單 8 最終會在頁面上生成如圖 7 所示的對話框。

基于HTML5 Widget Dojo開發教程

圖 7. 由 Widget 生成的對話框

在實際應用中,本文介紹的對話框 Widget 的設計和實現可以作為原型來進一步增強和擴展,以滿足實際項目的需求。而這種結合了 HTML5 新特性的 Widget 設計方法和實現思路則可以運用到很多應用場景中。

小結:基于HTML5 Widget Dojo開發教程的內容介紹完了,希望通過HTML5 Widget內容的學習能對你有所幫助!

責任編輯:zhaolei 來源: IBM
相關推薦

2011-08-01 16:43:51

ibmdwHTML5Dojo

2011-02-25 10:19:23

ibmdwHTML5Web開發

2011-04-22 15:02:19

HTML5Dojo

2016-10-19 10:49:43

Linux

2011-09-08 16:17:45

Widget

2011-02-23 11:22:59

DojoHTML 5

2013-05-28 11:08:51

人臉識別html5

2015-08-14 10:44:33

HTML5

2016-05-27 15:44:12

H5LeanCloudWex5

2010-06-13 09:45:35

Widget開發

2011-09-07 13:00:36

2014-03-18 16:19:15

HTML5實戰教程

2015-07-06 09:57:04

HTML5CSS框架BootFlat

2012-04-01 10:02:00

HTML5

2013-03-21 09:32:41

2012-10-09 11:02:11

IBMdw

2013-07-17 09:51:17

HTML5神器

2014-03-18 09:20:17

HTML5移動開發

2013-01-24 10:26:04

HTML5HTML 5HTML5的未來

2012-03-06 10:56:32

HTML 5
點贊
收藏

51CTO技術棧公眾號

亚洲国产一区二区三区在线播放| 超碰影院在线观看| 久久久久人妻一区精品色欧美| 天堂√中文最新版在线| 久久久精品黄色| 国产精品入口福利| 麻豆视频在线观看| 亚洲aaa级| 欧美片网站yy| 国产精品av免费观看| 亚洲AV午夜精品| 久久久久久亚洲精品杨幂换脸| 亚洲激情视频网| 亚洲精品自拍网| 97天天综合网| 国产精品麻豆久久久| 国产一区精品视频| 亚洲自拍第二页| 日韩视频免费| 久久影视免费观看| jizz中文字幕| 国产66精品| 7777女厕盗摄久久久| 97国产在线播放| 亚洲羞羞网站| 中文字幕中文在线不卡住| 精品国产乱码久久久久久88av| 久久精品女人毛片国产| 日韩一区欧美| 亚洲网在线观看| 免费的av网站| 亚洲综合影院| 欧美一区二区三区在线观看| 免费看a级黄色片| 后进极品白嫩翘臀在线播放| 国产精品国产自产拍高清av| 欧美日韩电影一区二区| 午夜久久久久久噜噜噜噜| 精品制服美女丁香| 国产精品久久久久77777| 午夜影院在线看| 亚洲性色视频| 欧美肥老妇视频| 久久久久成人片免费观看蜜芽| 国产精品白丝av嫩草影院| 欧美久久久久久久久久| wwww.国产| 国产成人午夜性a一级毛片| 日韩欧美国产骚| 午夜精品久久久久久久无码| 欧美裸体视频| 五月婷婷久久丁香| 可以在线看的av网站| av剧情在线观看| 婷婷久久综合九色综合绿巨人| 日韩欧美在线电影| 欧美成人免费| 久久亚洲影视婷婷| 欧洲亚洲一区二区| 粉嫩av一区| 中文字幕不卡在线观看| 亚洲精品一区二区三区四区五区 | 国产黄色小视频网站| 青青草91久久久久久久久| 一本一道久久a久久精品逆3p| 久久久九九九热| 亚洲免费看片| 日韩欧美国产系列| 国产精品手机在线观看| 美女扒开腿让男人桶爽久久动漫| 欧美日产在线观看| 天天色天天综合网| 精品视频在线观看免费观看| 日韩欧美国产一二三区| 天天插天天射天天干| 久草在线成人| www.日本久久久久com.| 日韩在线观看视频一区二区| 国产精品啊啊啊| 91精品国产一区| 成人黄色免费网| 国模少妇一区二区三区| 国产区欧美区日韩区| 可以在线观看的av网站| 成人免费在线播放视频| 久艹在线免费观看| 久久久成人av毛片免费观看| 欧美妇女性影城| 一边摸一边做爽的视频17国产| 中文成人在线| 亚洲成人教育av| 国产三级在线观看完整版| 91偷拍一区二区三区精品| 色综合男人天堂| 天天干天天干天天| 激情久久久久久久久久久久久久久久| 国产精品白丝jk喷水视频一区| 精品视频在线观看免费| 日日摸夜夜添夜夜添国产精品| 国模精品系列视频| 国产成人av免费| 成人免费精品视频| 亚洲mv在线看| 国产探花在线观看| 在线观看av一区二区| 丰满人妻一区二区三区大胸| 精品国产视频| 午夜精品一区二区三区av| 一级全黄少妇性色生活片| 成人一区二区在线观看| 在线看成人av电影| 新版的欧美在线视频| 欧美一级二级在线观看| 中文字幕第4页| 亚洲激情女人| 91一区二区三区| sese在线视频| 欧美性感美女h网站在线观看免费 欧美性xxxx在线播放 | av在线资源观看| 久久久亚洲精品一区二区三区| 久久精品综合一区| 菠萝蜜视频国产在线播放| 在线观看一区二区视频| 亚洲欧美日韩偷拍| 伊人情人综合网| 国产精品免费在线免费 | 麻豆精品一二三| 国产精品免费视频一区二区| 黄色网页在线免费观看| 日本道精品一区二区三区| 精品中文字幕在线播放| 激情久久一区| 成人国产一区二区| 在线黄色网页| 日韩一区二区电影网| 网爆门在线观看| 日本午夜精品视频在线观看| 欧美高清视频一区| 中文字幕 在线观看| 亚洲成人动漫在线播放| 久久久久久av无码免费网站| 国产精品中文有码| 麻豆md0077饥渴少妇| 亚洲成人精品综合在线| 久久精品久久久久久国产 免费| 麻豆chinese极品少妇| 国产一区在线不卡| 自拍视频一区二区三区| 国产精品国产三级在线观看| 日韩在线中文视频| 国产精品福利电影| 亚洲人成亚洲人成在线观看图片 | 91麻豆精品国产91久久久久| 国产午夜精品久久久久久久久| 欧美在线网站| 91精品网站| 电影k8一区二区三区久久| 日韩欧美一区二区视频| 欧美人与禽zozzo禽性配| 国产成人精品一区二区三区四区 | 日本高清不卡在线观看| 偷拍夫妻性生活| 日本女人一区二区三区| 亚洲一区二区自拍偷拍| 国产区一区二| 久久久久久久影院| 天天综合永久入口| 欧美小视频在线观看| 国产在线免费av| 久久电影网站中文字幕| 色哺乳xxxxhd奶水米仓惠香| 伊人久久噜噜噜躁狠狠躁| 国内精品视频一区| 免费一级毛片在线观看| 欧美少妇性性性| 免费在线观看一级片| 暴力调教一区二区三区| www.四虎成人| 婷婷精品进入| 国产伦精品一区二区三区照片| 色欧美激情视频在线| 日韩欧美一级二级三级| 亚洲男人第一av| 国产精品美女久久久久久| 蜜桃福利午夜精品一区| 亚洲福利专区| 亚洲精品一区二区三区av| 亚洲一区二区三区中文字幕在线观看| 久久精品久久久久电影| 色婷婷在线视频| 欧美日韩在线观看一区二区| 五月婷婷一区二区| 国产日本欧美一区二区| 一二三级黄色片| 亚洲免费影视| 热久久最新网址| 精品国产一区二区三区香蕉沈先生 | heyzo中文字幕在线| 亚洲男人第一网站| 国产精品人人爽| 日韩欧美亚洲综合| 久久久久久久久久久网| 国产肉丝袜一区二区| 在线xxxxx| 久久电影网电视剧免费观看| 黑森林福利视频导航| 欧美福利一区| 亚洲欧洲国产日韩精品| 欧美91在线| 亚洲xxxx在线| 日韩美香港a一级毛片| 欧洲午夜精品久久久| caoporn免费在线| 中文亚洲视频在线| 日韩精品福利| 精品成人佐山爱一区二区| 亚洲天堂中文网| 色综合咪咪久久| 国产精品免费av一区二区| 亚洲免费伊人电影| 亚洲一区电影在线观看| 欧美韩日一区二区三区| 成人精品在线观看视频| 成人精品一区二区三区四区 | 中文在线а√在线8| 欧美日韩国产成人| 老司机午夜在线| 中文字幕在线亚洲| 国产在线观看精品一区| 亚洲第一页在线| 国产福利视频导航| 91精品国产综合久久久久久久| 久久免费精彩视频| 国产精品理论片| 日本午夜精品视频| 欧美激情一区二区| 久久久久99精品成人| 久久精品免视看| 成人免费无遮挡无码黄漫视频| 激情深爱一区二区| 午夜激情视频网| 黄色小说综合网站| 国内av一区二区| 国产一区二区三区蝌蚪| 特级黄色片视频| 国产乱妇无码大片在线观看| 亚洲欧美日韩网站| 国产一区二区在线看| www.久久av.com| 国产一区二区在线视频| 97免费公开视频| 国产91精品一区二区麻豆网站| 任你操这里只有精品| 久久激情中文| 日本激情视频在线播放| 激情亚洲综合在线| 男人午夜视频在线观看| 国内精品国产成人| 亚洲无人区码一码二码三码| 99免费精品在线观看| 玖玖爱在线观看| 国产区在线观看成人精品| 中文字幕第69页| 亚洲欧美日韩国产中文在线| 国产在线观看你懂的| 偷拍亚洲欧洲综合| 99久久久久久久久| 欧美日韩大陆一区二区| 国内精品国产成人国产三级| 亚洲成人在线视频播放| 久久久资源网| 久久精品中文字幕一区| 免费看电影在线| 欧洲亚洲免费视频| 9999在线精品视频| 国产伦精品一区二区三区四区视频| 91九色综合| 91天堂在线观看| 久久悠悠精品综合网| 日本午夜精品一区二区三区| 久久高清精品| 久久精品国产sm调教网站演员| 欧美日韩一区二区高清| 人妻少妇精品无码专区二区| 丝袜亚洲另类丝袜在线| 亚洲第一天堂久久| 91一区一区三区| 任我爽在线视频| 香港成人在线视频| 中文字幕91爱爱| 亚洲国产成人久久综合| av电影在线网| 韩国福利视频一区| 欧美成人三级| 久久国产精品-国产精品| 久久人人88| 欧美丰满熟妇bbbbbb百度| 美女爽到高潮91| 玖草视频在线观看| 亚洲欧洲成人精品av97| 亚洲男人第一av| 日韩一级完整毛片| av中文字幕在线| 91精品国产免费久久久久久 | 欧美在线free| 亚洲国产精品二区| 中文字幕亚洲一区在线观看| 丰满诱人av在线播放| 国产精品色悠悠| 日韩美脚连裤袜丝袜在线| 欧洲美女和动交zoz0z| 日本欧美一区二区三区| 少妇被狂c下部羞羞漫画| 亚洲欧美一区二区在线观看| 亚洲第一网站在线观看| 精品美女被调教视频大全网站| 蜜桃视频久久一区免费观看入口| 日韩欧美一区电影| 免费a级毛片在线播放| 日韩av电影免费观看高清| 粉嫩精品导航导航| 国产高清免费在线| 美腿丝袜在线亚洲一区| 国产一区二区三区四区五区六区 | 777午夜精品电影免费看| 国产麻豆乱码精品一区二区三区| 久久影视三级福利片| 欧美视频在线第一页| 精品一区二区三区在线播放视频| 精品国产午夜福利在线观看| 国产精品天天看| 中国一级特黄视频| 在线播放亚洲激情| 欧美暴力调教| 视频一区二区综合| 日本午夜一区二区| 久久久久久久毛片| 欧美综合视频在线观看| 国产鲁鲁视频在线观看免费| 国产成人精品视频| 九九在线精品| 国产熟人av一二三区| 久久精品人人做人人综合 | 一区二区三区免费在线观看视频| 国产亚洲一二三区| 日批视频免费在线观看| 日韩电影中文字幕在线| 妞干网免费在线视频| 精品在线视频一区二区三区| 国产一区二区三区久久久久久久久| 国产喷水theporn| 国产精品免费视频网站| 亚洲图片中文字幕| 久久影视电视剧免费网站| 美国十次综合久久| 欧美日韩不卡在线视频| 91在线你懂得| 欧美超碰在线观看| 中文字幕日韩在线视频| 成人亚洲精品| www.日本少妇| 久久亚区不卡日本| 中国女人一级一次看片| 美日韩精品免费视频| 国产精品久久久久av蜜臀| 丝袜老师办公室里做好紧好爽| 国产激情一区二区三区四区 | 天天操天天干天天| 17婷婷久久www| 欧美日韩中字| 亚洲国产欧美日韩在线| 五月婷婷综合网| 中文日本在线观看| 91视频免费网站| 国产日韩一区| 天天鲁一鲁摸一摸爽一爽| 欧美mv日韩mv国产网站app| 最新日韩精品| 中文字幕乱码一区二区三区| 成人小视频免费观看| 无码人妻精品一区二区三区不卡| 日韩电视剧在线观看免费网站| 18videosex性欧美麻豆| 精品国产乱码久久久久久蜜柚 | 国产精品嫩草影院av蜜臀| 国产按摩一区二区三区| 91福利视频网| 婷婷久久一区| 中文字幕成人动漫| 日韩一级成人av| 日韩伦理三区| 欧美又粗又长又爽做受| 欧美国产1区2区| 亚洲精品字幕在线观看| 国产精品高清在线观看| 影音先锋亚洲电影| 亚洲国产精品一区二区久久hs| 欧美三区在线视频| wwww在线观看免费视频| 亚洲第一导航|