精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

精品人妻少妇嫩草av无码专区 | 欧美日韩一本到| 久久青青草综合| 国产在线精品播放| 欧美wwwwwww| 高h视频在线观看| 成人小视频在线| 日韩av观看网址| 538精品在线视频| 麻豆av免费看| 三级资源在线| 国产日本欧洲亚洲| 亚洲综合视频1区| 天天操夜夜操视频| 亚洲精品在线观看91| 日韩激情视频在线| www.欧美激情.com| 中国色在线日|韩| 亚洲免费观看视频| 日韩免费毛片| 国产91免费看| 国内精品伊人久久久久av影院| 91精品国产高清久久久久久91| 特级西西人体高清大胆| 久久香蕉精品香蕉| 91精品国产综合久久精品性色| 国产一区二区三区精彩视频| av激情在线| 91精品一区二区三区综合在线爱| 日韩免费一区| 91精品麻豆日日躁夜夜躁| 久久精品免费一区二区| av官网在线播放| 国产精品色在线观看| 国产一区二区三区av在线| 91麻豆国产在线| 久久影院亚洲| 668精品在线视频| 久久久久久久久久91| 9191国语精品高清在线| 国产亚洲欧洲在线| 欧美深性狂猛ⅹxxx深喉| 亚洲成人五区| 欧美一区欧美二区| 污污网站在线观看视频| 日韩一区二区三区在线免费观看| 婷婷久久综合九色综合伊人色| 黄色一级片av| www在线视频| 中文字幕在线观看一区二区| 色噜噜狠狠一区二区三区| 酒色婷婷桃色成人免费av网| 99国产精品久久| 精品国产乱码久久久久久88av| 亚洲精品国产精品乱码不卡| 国产精品一区专区| 99在线观看视频| 亚洲av无码片一区二区三区| 国产成人精品网址| 豆国产97在线| 日本黄色三级视频| 91亚洲资源网| 欧美一二三四五区| 日韩av手机版| 国产精品动漫网站| av色在线观看| 亚洲一区二区高清| www.xxx麻豆| 超碰97国产精品人人cao| 亚洲女爱视频在线| 免费看日b视频| 啦啦啦中文在线观看日本| 一区二区国产盗摄色噜噜| 波多野结衣与黑人| 操喷在线视频| 欧美性xxxxxxx| 欧美婷婷精品激情| www.久久99| 精品久久久久久久久久久院品网 | 91中文字幕永久在线| 网曝91综合精品门事件在线| 亚洲少妇激情视频| 亚洲女人毛茸茸高潮| 国产视频精选在线| 日本午夜免费一区二区| 色天天综合色天天久久| 一级在线免费视频| 免费一级欧美在线大片 | 色婷婷在线视频| 久久久影视传媒| 中文字幕一区二区三区最新| 欧美日韩经典丝袜| 欧美性猛交xxxx富婆弯腰| 冲田杏梨av在线| 午夜视频在线观看精品中文| 日韩精品视频免费| 天堂а√在线中文在线鲁大师| 欧美69视频| 欧美在线视频一二三| 涩涩视频在线观看| 国产大片一区二区| 欧美一区二区影视| 四虎亚洲成人| 91极品美女在线| 欧美色图校园春色| 亚洲福利网站| 欧美二区在线播放| 免费污污视频在线观看| 狠狠色综合色综合网络| 久久久久免费网| 国产激情小视频在线| 黄色91在线观看| 天堂在线一区二区三区| 久久亚洲AV无码| 欧美1区2区3区4区| 久久大大胆人体| 亚洲 欧美 中文字幕| 国产成人在线视频网址| 亚洲v国产v| 欧美男人天堂| 日韩三级高清在线| 欧美日韩国产一二三区| 国产精品尤物| 国产福利一区二区三区在线观看| 成人77777| 欧美日韩人人澡狠狠躁视频| 久久久久亚洲av无码网站| 欧美高清在线| 国产成人精品免高潮在线观看| 黄色片一区二区| 一区二区三区四区在线播放| 91制片厂毛片| 国产免费久久| 欧美一级高清免费播放| 丰满肥臀噗嗤啊x99av| 亚洲日本电影在线| 成人黄色一级大片| 国产欧美日韩在线观看视频| 亚洲日本护士毛茸茸| 欧美精品www在线观看| 中文字幕无线码一区| 久久综合九色欧美综合狠狠 | 国产精品草草| 92国产精品久久久久首页| 日本在线观看免费| 欧美三级在线播放| 日本污视频网站| 日本三级亚洲精品| 日本公妇乱淫免费视频一区三区| 精精国产xxxx视频在线野外| 精品国产乱码久久久久久蜜臀| 久操视频免费在线观看| 国产91综合一区在线观看| 51xx午夜影福利| 亚洲va欧美va人人爽成人影院| 色综合五月天导航| 亚洲精品久久久久久久久久 | 欧美 国产 精品| 高清一区二区中文字幕| 欧美区二区三区| 黑人乱码一区二区三区av| 围产精品久久久久久久| 午夜激情久久久| 成人在线观看一区二区| 国产综合欧美| 国产精品视频福利| 电影在线观看一区| 亚洲美女动态图120秒| 黄色一级视频免费看| 国产日韩高清在线| 亚洲天堂国产视频| 国产伊人精品| 人妻体体内射精一区二区| 三上悠亚国产精品一区二区三区| 日韩成人av在线| 中文字幕在线播| 国产精品久久久久久久久免费丝袜 | 中文字幕一区二区三区四区在线视频 | 欧美剧在线免费观看网站 | 日韩大片在线| 91午夜在线播放| 2021中文字幕在线| 国产视频精品一区二区三区| 成人一二三四区| 亚洲日本韩国一区| 国产十八熟妇av成人一区| 日一区二区三区| 黄色网zhan| 婷婷综合电影| 91精品啪aⅴ在线观看国产| av电影院在线看| 在线观看视频99| 成人激情四射网| 91久久免费观看| 麻豆亚洲av成人无码久久精品| 久久午夜国产精品| 欧美色图校园春色| 日本在线不卡视频| 日本中文字幕在线视频观看| 欧美**vk| 国产精品播放| 久久精品黄色| 68精品久久久久久欧美| 韩国中文字幕在线| 精品一区二区三区电影| 国产成人a人亚洲精品无码| 一本大道av伊人久久综合| 亚洲欧美小视频| 国产婷婷色一区二区三区| 91porn在线| 久久99精品一区二区三区| 国产免费黄色av| 欧美日韩 国产精品| 视频一区二区在线| 永久免费未满蜜桃| 国产免费成人| 青草网在线观看| 国产精品国产一区| 日韩精品一线二线三线| 国产精品视屏| 91gao视频| 韩国精品视频在线观看| 欧美一二三视频| 91福利区在线观看| 欧美成人在线免费| 精品国产白色丝袜高跟鞋| 亚洲色图在线观看| 天堂影院在线| 日韩欧美激情四射| 国产露脸91国语对白| 欧美视频在线不卡| 国产suv精品一区二区33| 亚洲国产一二三| 欧美激情国产精品免费| 中文字幕在线不卡| 久久午夜精品视频| 国产片一区二区三区| 国产精品无码久久久久久| www.99精品| 亚洲日本久久久| 成人污污视频在线观看| 中文字幕永久免费| 国产91对白在线观看九色| 欧美日韩国产91| 亚洲精品午夜久久久久久久| 亚洲在线成人精品| 麻豆视频在线观看| 亚洲国产你懂的| 日本在线观看视频网站| 亚洲成人tv网| 中日韩精品视频在线观看| 亚洲国产一区视频| 欧美日韩综合在线观看| 欧美日韩在线另类| 丁香社区五月天| 欧洲精品一区二区| 中文字幕乱码在线观看| 欧美日韩在线播放| 国产免费高清av| 欧美无人区码suv| 一区二区蜜桃| 日本道在线视频| 91tv官网精品成人亚洲| 欧洲精品视频在线| 欧美色网址大全| 91xxx视频| 激情久久五月| 精品一区二区中文字幕| 日韩精品成人一区二区在线| 中文字幕视频在线免费观看| 久久精品免费看| 亚洲av无一区二区三区久久| 成人永久免费视频| 久久无码人妻精品一区二区三区| 久久色成人在线| 亚洲人做受高潮| 琪琪久久久久日韩精品| 日韩一区二区三区四区| 亚洲免费不卡视频| 亚洲精品在线观看www| 成人激情电影在线看| 欧美成人激情视频| 国产精品电影| 国产欧美精品在线播放| 国产一区二区视频在线看| 国产精品综合久久久久久| 少妇一区二区视频| 欧美 国产 精品| 亚洲综合精品四区| 一级片免费在线观看视频| 91亚洲国产成人精品一区二三 | 91麻豆免费看| 二区三区四区视频| 精品久久久久久久久久久| 伊人免费在线观看| 精品国产91九色蝌蚪| аⅴ资源新版在线天堂| 久久久女女女女999久久| 色在线中文字幕| 99热国产精品| 91热视频在线观看| 99久久精品国产麻豆演员表| 貂蝉被到爽流白浆在线观看| 亚洲成人av在线电影| 中文字幕激情视频| 亚洲电影免费观看高清完整版在线观看 | 国产av自拍一区| 一区二区三区在线观看欧美| www.久久视频| 亚洲第一页中文字幕| 在线观看的av| 国产91精品高潮白浆喷水| 日韩在线亚洲| 一区二区三区四区欧美| 亚洲欧美视频一区二区三区| 中文字幕色网站| 久久精品视频在线免费观看| 岛国毛片在线观看| 欧美影院一区二区| 欧美人体大胆444www| 国内伊人久久久久久网站视频| 亚洲在线资源| 亚洲二区自拍| 裸体一区二区| 污污内射在线观看一区二区少妇| 自拍偷拍亚洲欧美日韩| 中文字幕永久免费视频| 亚洲欧美精品一区| 在线观看网站免费入口在线观看国内 | 成人毛片免费| 日本一区二区高清视频| 99热这里只有成人精品国产| 97精品国产aⅴ7777| 国产美女主播在线观看| 亚洲欧美制服丝袜| 国产在线天堂www网在线观看| 在线免费看h| 中文字幕第一区第二区| 久久精品免费在线| 日韩一区二区三区精品视频| se在线电影| 国产精品福利网站| 美女久久99| 国产偷人视频免费| 97se亚洲国产综合自在线| 动漫精品一区一码二码三码四码| 3d成人h动漫网站入口| 网友自拍视频在线| 成人中心免费视频| 久久久久久久久久久妇女| 五月激情五月婷婷| 国产精品女主播在线观看| 亚洲影视一区二区| 日韩视频免费看| 9999精品免费视频| 艳母动漫在线观看| 国产一区二区在线观看免费| 天天操夜夜操av| 欧美一区在线视频| 伊人在我在线看导航| 97se亚洲综合| 亚洲清纯自拍| av直播在线观看| 91极品美女在线| 人人干在线视频| 97se国产在线视频| 亚洲小说区图片| 精品久久久久久| 天天干,天天操,天天射| 2018中文字幕一区二区三区| 尤物tv在线精品| 日本久久久久久久久久久久| 国产精品久久久久精k8 | 亚洲精品电影| 亚洲av无码专区在线播放中文| 亚洲777理论| 国产在线播放av| 91系列在线播放| 亚洲视频大全| 欧美巨胸大乳hitomi| 日韩午夜在线影院| 手机在线理论片| 一区二区三区不卡在线| 懂色中文一区二区在线播放| 9i看片成人免费看片| 色婷婷综合成人| 电影一区二区在线观看| 日本在线视频www| 亚洲天天做日日做天天谢日日欢| 亚洲av无码国产精品久久不卡| 欧美专区在线播放| 91精品天堂福利在线观看| 在线观看成人动漫| 精品视频一区三区九区| 国产精品国精产品一二| 日韩av不卡播放| 成人三级伦理片| 一级全黄少妇性色生活片| 97国产成人精品视频| 日韩久久精品|