byId

在dojo中,除了沿用Dom結點, dojo 還自定義了一類結點用“dojoType" 進行標識。

dojo 稱這些結點爲widget。 當檢測到HTMl文檔中某個標籤定義了dojoType 屬性之後,dojo會調用dojo包中相應的 js 及 css 文件對這個結點進行渲染。 從而這個結點元素就會相應地顯示出具有dojo特色的樣式及功能。

如此說來, dom.byId 跟 dojo.byId 獲取到的就是普通的HTMl文檔結構樹中的某個結點元素,以下簡稱dom結點, 而 registry.byId 獲取到的是一個dojo的widget,以下簡稱widget結點。

它們的區別之一是 innerHTML, tagName 等方法只對用 dom結點生效。

如果

element =registry.byId("someId"),

element.innerHTML = "some message"

這個命令並不會在頁面上顯示 "some message" 。


而下面這一句是可以在頁面上顯示出 “hello world" 的。

dom.byId("someNode").innerHTML = "Hello World";


同樣的,有一些命令僅對widget 結點生效,如果用dom結點去用這些命令的話,控制檯會提示 “元素爲空”類似的錯誤信息。


有一個很簡單的方法可以檢查一下是否獲取到了想要的結點,如下:

[javascript] view plain copy派生到我的代碼片
  1. var dijit = registry.byId("testdom");  
  2.         if(dijit){  
  3.            alert("yes")}  
  4.         else{  
  5.            alert("no")};  

參考:

dojotoolkit - registry http://dojotoolkit.org/reference-guide/1.9/dijit/registry.html點擊打開鏈接

dojotoolkit - dojo.byId http://dojotoolkit.org/reference-guide/1.7/dojo/byId.html點擊打開鏈接

dojotoolkit - dom http://dojotoolkit.org/reference-guide/1.8/dojo/dom.html點擊打開鏈接

補充

昨天寫代碼遇到一個問題,就是用dom結點還是widget 結點的問題。 

代碼如下:

[javascript] view plain copy派生到我的代碼片
  1.     var comment = dom.byId("comments");  
  2. var newcomment = new listitem;  
  3. newcomment.innerHTML = "msg";  
  4. newcomment.placeAt(comment,"first");  
id=comments 是html 文件中的一個空的div 標籤。

目的是用new listitem 新生成一個widget, 在它裏面寫入文本”msg", 然後把這個listitem 放到id=comments 的div中。

由於newcomment 是一個dojo的widget 對象, 它沒有innerHTML方法,所以newcomment.innerHTMl = "msg" 這種寫法無法得到想要的效果, 最終頁面中展示的是一個空的listitem. 這種情況下firebug沒有錯誤提示,如果一開始沒有dom結點與widget結點有區別的概念的話,調試起來會比較困難。

對於widget結點,要想獲取它的dom結點,用node.domNode 就可以。所以上面代碼的第三行寫成


        newcomment.domNode.innerHTML = msg;

問題就能夠解決。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章