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。