文章目錄
本文翻譯自:
Dojo DOM Functions
原作者: Sam Foster
翻譯: Siqi (siqi.zhong@gmail.com)
在本教程中,您將學到如何使用Dojo簡單地跨平台操作DOM。只需要基本DOM知識和幾個Dojo函數,您就能高效地建立、讀取、更新或是刪除頁面上的元素。
難度:初學者
Dojo 版本:1.6
開始上手
從基於瀏覽器的JavaScript受到關注時起,Document Object Model (DOM) 就是我們繪製所要內容的的地方,也是使用者所看到的介面。如果我們想要增強、替換或是向瀏覽器載入好的HTML添加點什麼東西,JavaScript和DOM便是我們所需要的。Dojo旨在使DOM操作變得更加簡單、高效,為此Dojo提供了一些方便的函數來解決不同瀏覽器間惱人的的相容性問題,並讓常用操作更加簡潔。
為了瞭解這些函數,我們將操作一個簡單的頁面,該頁面中有一個含有五個元素的無序列表:
<!DOCTYPE html><br /><html><br /> <head><br /> <meta charset="utf-8"><br /> <title>Demo: DOM Functions</title></p><p> <mce:script src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js" mce_src="http://ajax.googleapis.com/ajax/libs/dojo/1.6/dojo/dojo.xd.js"></mce:script><br /> <mce:script type="text/javascript"><!--<br /> dojo.ready(function(){ // "ready" entry point</p><p> });</p><p>// --></mce:script><br /> </head><br /> <body><br /> <ul id="list"><br /> <li id="one">One</li><br /> <li id="two">Two</li><br /> <li id="three">Three</li><br /> <li id="four">Four</li><br /> <li id="five">Five</li><br /> </ul><br /> </body><br /></html>
這個頁面已經含有Dojo指令碼標籤, 相信你已經認識dojo.ready代碼塊。所有對DOM進行操作的代碼必須等到DOM載入完畢後才能被執行。
檢索
事有先後:為了對DOM進行操作,我們首先需要知道如何從DOM中擷取元素。最簡單的方法是使用dojo.byId。在你將一個你想要獲得的元素的ID傳給dojo.byId之後,如果ID相符的DOM節點存在,你將獲得該節點,如果沒有匹配的節點,那麼將獲得null。
這和使用document.getElementById是等價的,但是使用dojo.byId有兩個優點:更簡潔,並解決了某些瀏覽器對getElementById實現的bug。另一個dojo.byId很棒的特點是,如果你將一個DOM節點傳給它,它將馬上返回該節點。這有助於建立同時適用字串與DOM節點的API。讓我們來看一個例子:
function setText(node, text){<br /> node = dojo.byId(node);<br /> node.innerHTML = text;<br />}</p><p>dojo.ready(function(){<br /> var one = dojo.byId("one");</p><p> setText(one, "One has been set");<br /> setText("two", "Two has been set as well");<br />});
查看樣本
setText函數用來設定一個節點的文字內容,由於dojo.byId可以接受DOM節點作為參數,該函數也就可以接受字串或者DOM節點。
建立
另一個你會經常做的事情就是建立元素。Dojo不會阻止你使用原生的document.createElement方法來建立元素,但是建立一個元素並為其設定所有需要的屬性可能會是非常冗長的。更可怕的是,你將面對不少不同瀏覽器差異造成的額外屬性設定。而這使得dojo.create不可謂是一個更方便、可靠的選擇。
dojo.create有如下參數:節點名(字串)、節點的屬性(object)、可選的父節點或是兄弟節點、可選的與父節點或是兄弟節點的相對位置(預設為“last”)。它返回建立的DOM元素節點。讓我們看一個例子:
dojo.ready(function(){<br /> var list = dojo.byId("list"),<br /> three = dojo.byId("three");</p><p> dojo.create("li", {<br /> innerHTML: "Six"<br /> }, list);</p><p> dojo.create("li", {<br /> innerHTML: "Seven",<br /> className: "seven",<br /> style: {<br /> fontWeight: "bold"<br /> }<br /> }, list);</p><p> dojo.create("li", {<br /> innerHTML: "Three and a half"<br /> }, three, "after");<br />});
查看樣本
一個簡單的內容為“Six”的列表元素被建立並被添加到列表中。接著,另一個內容為“Seven”的列表元素被建立,它的className屬性為”seven”,該樣式使其字型為粗體,然後該元素被添加到列表中。最後,一個內容為“Three and a half”的列表元素被建立並被插入到ID為“three”的列表元素之後。
什麼時候該像這樣建立元素,什麼時候該直接設定一個容器的innerHTML 屬性呢?如果你已經有一個你所需要的HTML內容的字串時,設定innerHTML 屬性肯定會更快一點。但是,dojo.create的優勢在你想要建立節點但又不需要立即將他們添加到DOM中,或是當你想要插入或是添加一個新元素而不影響周圍的兄弟節點時就體現出來了。
安插
如果你已經有了一個節點並且想將安插到某處,你將會需要用到dojo.place。其參數如下:DOM節點或一個想要安插的節點的ID、DOM節點或是一個參照節點的ID、可選的位置(字串,預設為“last”)。這和我們看到的dojo.create的參數表很像,事實上,dojo.create在底層使用了dojo.place。在前面的例子基礎上,我們向頁面加了幾個按鈕:
<button onclick="moveFirst();">The first item</button><br /><button onclick="moveBeforeTwo();">Before Two</button><br /><button onclick="moveAfterFour();">After Four</button><br /><button onclick="moveLast();">The last item</button>
下面代碼定義了一些使用dojo.place來移動列表中第三個節點的函數:
function moveFirst(){<br /> var list = dojo.byId("list"),<br /> three = dojo.byId("three");</p><p> dojo.place(three, list, "first");<br />}</p><p>function moveBeforeTwo(){<br /> var two = dojo.byId("two"),<br /> three = dojo.byId("three");</p><p> dojo.place(three, two, "before");<br />}</p><p>function moveAfterFour(){<br /> var four = dojo.byId("four"),<br /> three = dojo.byId("three");</p><p> dojo.place(three, four, "after");<br />}</p><p>function moveLast(){<br /> var list = dojo.byId("list"),<br /> three = dojo.byId("three");</p><p> dojo.place(three, list);<br />}
查看樣本
安插位置的有效參數可以是"before"、"after"、"replace"、"only"、"first"或"last"。有關每種安插選項的含義請參見reference guide for dojo.place 。
在這個簡單的例子裡,dojo.place比原生的parentNode.appendChild(node)稍稍多做了一點事情。它可以簡單地指定安插的位置,無論是相對於父節點或是兄弟節點——使用一個一致的API。
刪除
通常你會建立節點,不過有時候,你也會想要刪除某些節點。Dojo提供了兩種方法來刪除節點:dojo.destory會刪除一個節點和其所有的子節點,而dojo.empty將只刪除一個節點的子節點。這兩種方法都接受一個DOM節點或是一個節點的ID作為參數。我們將向我們的頁面添加兩個按鈕:
<button onclick="destroyFirst();">Destroy the first list item</button><br /><button onclick="destroyAll();">Destroy all list items</button>
function destroyFirst(){<br /> var list = dojo.byId("list"),<br /> items = list.getElementsByTagName("li");</p><p> if(items.length){<br /> dojo.destroy(items[0]);<br /> }<br />}</p><p>function destroyAll(){<br /> dojo.empty("list");<br />}
查看樣本
第一個按鈕在使用者按下時刪除列表中的第一個元素。第二個按鈕則清空整個列表。
總結
現在,我們有了一套比較全面的用來操作DOM的工具,從建立節點到移動節點再到刪除它們——但它們在同一個時刻都只能對一個節點進行操作。如果你想要對一些沒有ID的節點進行操作怎麼辦?下一個教程將會介紹dojo.query,它可以讓我們基於CSS選取器來尋找、動作節點!