學習Ajax架構之dojo:第十一節——Dojo 的General Widget(上)(附原始碼)

來源:互聯網
上載者:User

General Widget 是Dojo提供的一組通用的widget,每一種General Widget 實現的功能都相對獨立。下面我們來看看都是什麼樣的widget吧。

1. Tree:樹形菜單

在講解Dojo的Layout Widget的AccordionContainer時,已經介紹並使用過Tree了,有興趣的朋友可以參看學習Ajax架構之dojo:第八節——Dojo的Layout Widget的第四部分AccordionContainer的樣本,在這裡不再贅述!

 

2. Button:按鈕

之前,也已經用到該widget。簡單的說一下用法:<div dojoType="Button" id="button">This is a button</div>

 

3. Menu:下拉式功能表

我們使用樣本來說明Menu的使用方法以及Menu屬性的用法。

樣本1:首先,我們需要引入Menu包: dojo.require("dojo.widget.Menu2")。當點擊滑鼠右鍵時,彈出該功能表項目。如下:

1)主菜單為:

<div dojoType="PopupMenu2" contextMenuForWindow="true" toggle="explode">
      <div dojoType="MenuItem2" caption="Select All" disabled="true" onClick="alert('Shouldn\'t see this!');"></div>
      <div dojoType="MenuItem2" iconSrc="http://www.cnblogs.com/src/widget/templates/buttons/cut.gif" caption="Cut" accelKey="Ctrl+C"

            onClick="alert('not actually cutting anything, just a test!')"></div>
      <div dojoType="MenuItem2" iconSrc="http://www.cnblogs.com/src/widget/templates/buttons/copy.gif" caption="Copy" accelKey="Ctrl+X"
            onClick="alert('not actually copying anything, just a test!')"></div>
      <div dojoType="MenuItem2" iconSrc="http://www.cnblogs.com/src/widget/templates/buttons/paste.gif" caption="Paste" accelKey="Ctrl+V"
            onClick="alert('not actually pasting anything, just a test!')"></div>
      <div dojoType="MenuSeparator2"></div>
      <div dojoType="MenuItem2" caption="Do more stuff" submenuId="submenu1"></div>
</div>

2)caption為Do more stuff的子功能表:

<div dojoType="PopupMenu2" widgetId="submenu1" toggle="explode">
     <div dojoType="MenuItem2" caption="One" submenuId="submenu2" disabled="true"></div>
     <div dojoType="MenuItem2" caption="Two" submenuId="submenu2"></div>
</div>

<div dojoType="PopupMenu2" widgetId="submenu2" toggle="explode">
 <div dojoType="MenuItem2" caption="Three" onClick="alert('Three!')"></div>
 <div dojoType="MenuItem2" caption="Four" onClick="alert('Four!')"></div>
</div>

 

樣本2:需要引入的Menu包:dojo.require("dojo.widget.Menu2")和dojo.hostenv.writeIncludes()。頁面載入後,在頁面的最上方,顯示菜單導航條,如所示:

<div dojoType="MenuBar2">
     <div dojoType="MenuBarItem2" caption="File" submenuId="submenu1"></div>
     <div dojoType="MenuBarItem2" caption="Edit" submenuId="submenu2"></div>
     <div dojoType="MenuBarItem2" caption="View" disabled="true"></div>
     <div dojoType="MenuBarItem2" caption="Help" submenuId="submenu2"></div>
</div>

<div dojoType="PopupMenu2" widgetId="submenu1" contextMenuForWindow="true">
     <div dojoType="MenuItem2" caption="Enabled Item" onClick="alert('Hello world');"></div>
     <div dojoType="MenuItem2" caption="Disabled Item" disabled="true"></div>
     <div dojoType="MenuSeparator2"></div>
     <div dojoType="MenuItem2" caption="Enabled Submenu" submenuId="submenu2"></div>
     <div dojoType="MenuItem2" caption="Disabled Submenu" submenuId="submenu2" disabled="true"></div>
</div>

<div dojoType="PopupMenu2" widgetId="submenu2">
     <div dojoType="MenuItem2" caption="Submenu Item One" onClick="alert('Submenu 1!')"></div>
     <div dojoType="MenuItem2" caption="Submenu Item Two" onClick="alert('Submenu 2!')"></div>
</div>

在頁面上點擊滑鼠右鍵時,會出現隱藏的功能表項目,效果與樣本1的效果相同,僅僅功能表項目的內容不同而已。

 

樣本3:樣本1和樣本2讓我們學會了如何編寫功能表項目和子功能表項,讓功能表項目右擊顯示。那麼,如何讓菜單在指定的位置右擊顯示呢?需要什麼屬性來設定呢?該屬性在任何情況下都可以使用嗎?下面的樣本會一一幫你解答的!

需要引入的Menu包:dojo.require("dojo.widget.Menu2") 和 dojo.hostenv.writeIncludes()。

情況一:在標題為“Right click here!”上面右擊,顯示功能表項目。

<h3 id="test1" style="background-color: gray; display: block; width: 200px;text-align: center;">Right click here!</h3>

功能表項目:

<div dojoType="PopupMenu2" targetNodeIds="test1">
     <div dojoType="MenuItem2" caption="MENU1 Right click here!"></div> 
     <div dojoType="MenuItem2" caption="MENU1-Item 1"></div>
     <div dojoType="MenuItem2" caption="MENU1-Item 2"></div>
</div>

情況二:在div裡面的標題為“Testing from within a DIV”上面右擊,顯示功能表項目。

<div style="display: inline; width; 250px; background-color: navy; text-align: center; padding: 1em;">
    <h3 style="background-color: #B2B2B2; display: inline;" id="testwithindiv">Testing from within a DIV</h3>
</div>

情況二的功能表項目,同與情況一的功能表項目。

情況三:使用code完成功能表項目的載入,功能同情況一和情況二。

function init(){
      var menu = dojo.widget.createWidget("PopupMenu2", {targetNodeIds: ["test1", "test2", "testwithindiv"]});
      menu.addChild(dojo.widget.createWidget("MenuItem2", {caption: "MENU 1"}));
      menu.addChild(dojo.widget.createWidget("MenuItem2", {caption: "MENU1-Item 1"}));
      menu.addChild(dojo.widget.createWidget("MenuItem2", {caption: "MENU1-Item 2"}));
}
dojo.addOnLoad(init);

<h3 id="test1" style="background-color: gray; display: inline;">Right click here!</h3>

<h3 id="test2" style="background-color: #C1C1C1;display: inline;">Or here!</h3><br /><br />

<div style="display: tablecell; width; 70%; background-color: navy; text-align: center; padding: 1em;">
 <h3 style="background-color: #B2B2B2; display: inline;" id="testwithindiv">Testing from within a DIV</h3>
</div>

情況四:id="test1"的div裡面右擊,顯示功能表項目。

 <div style="background-color: yellow; display: block; width: 200px;" id="test1">

       Statically positioned block

       <div dojoType="PopupMenu2" targetNodeIds="test1">
             <div dojoType="MenuItem2" caption="MENU1-Item 1"></div>
             <div dojoType="MenuItem2" caption="MENU1-Item 2"></div> 
      </div>
 </div>

情況五:在SplitContainer中的ContentPane裡面右擊,顯示功能表項目。

 

 <div dojoType="SplitContainer"
  orientation="horizontal"
  sizerWidth="5"
  activeSizing="1"
  style="border: 2px solid black; width: 400px; height: 150px;"
 >
       <div dojoType="ContentPane" sizeMin="20" sizeShare="20" id="pane1">
             ContentPane 1
       </div>
       <div dojoType="ContentPane" sizeMin="50" sizeShare="50" id="pane2">
             ContentPane 2

             <div dojoType="PopupMenu2" targetNodeIds="pane1;pane2">
                   <div dojoType="MenuItem2" caption="MENU2-Item 1"></div>
                   <div dojoType="MenuItem2" caption="MENU2-Item 2"></div> 
             </div>
       </div>
 </div>

menu小結:總結上面的各種情況,實現的功能是一樣的,關鍵的屬性是targetNodeIds

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.