在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結點去用這些命令的話,控制檯會提示 “元素爲空”類似的錯誤信息。
有一個很簡單的方法可以檢查一下是否獲取到了想要的結點,如下:
- var dijit = registry.byId("testdom");
- if(dijit){
- alert("yes")}
- else{
- 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 結點的問題。
代碼如下:
- var comment = dom.byId("comments");
- var newcomment = new listitem;
- newcomment.innerHTML = "msg";
- newcomment.placeAt(comment,"first");
目的是用new listitem 新生成一個widget, 在它裏面寫入文本”msg", 然後把這個listitem 放到id=comments 的div中。
由於newcomment 是一個dojo的widget 對象, 它沒有innerHTML方法,所以newcomment.innerHTMl = "msg" 這種寫法無法得到想要的效果, 最終頁面中展示的是一個空的listitem. 這種情況下firebug沒有錯誤提示,如果一開始沒有dom結點與widget結點有區別的概念的話,調試起來會比較困難。
對於widget結點,要想獲取它的dom結點,用node.domNode 就可以。所以上面代碼的第三行寫成