dojo中的registry.byId和dom.byId之间的区别?使用registry.byId有什么好处?

时间:2014-04-29 22:27:20

标签: dojo

dojo中registry.byIddom.byId之间有什么区别?使用registry.byId的优势是什么?

在下面的代码中,我使用dijit/registrydojo/dom为我的文本框(#myTextBox3)和我的文本框节点(#textNode3)。其中只有两个提供了结果。

require(["dojo/parser", "dojo/dom", "dijit/registry", "dijit/form/TextBox", "dojo/domReady!"],
    function(parser, dom, registry) {

    parser.parse();

    // Locate the JS object.
    var dibiWidget = registry.byId("myTextBox3");
    var dobiWidget = dom.byId("myTextBox3");
    var dibiDOM = registry.byId("textNode3");
    var dobiDOM = dom.byId("textNode3");


    dom.byId("textNode3").innerHTML = "registry.byId for widget id returned: " + dibiWidget + "<br>" +
        "dom.byId for widget id returned: " + dobiWidget + "<br>" +
        "registry.byId for dom id returned: " + dibiDOM + "<br>" +
        "dom.byId for dom id returned: " + dobiDOM + "<br>";
});

2 个答案:

答案 0 :(得分:8)

这些模块有不同的用法。因此,使用registry.byId()(或dom.byId())没有任何优势,因为它们在用例方面有所不同。

的dijit /注册表:: byId()

dijit/registry模块的主要用途是检索小部件实例。引用reference guide

  

dijit / registry存储a中所有dijit小部件的集合   页。它通常用于从a检索对窗口小部件的引用   相关数据

道场/ DOM :: byId()

另一方面,dojo/dom模块只是访问DOM节点的模块。在reference guide上引用byId()的信息:

  

这是document.getElementById的一个简单别名,不仅如此   写得更短,但幸运的是适用于所有浏览器。它变成了一个   domNode对某个Node byId的引用,或者相同的节点引用if   通过了一个domNode。

这是什么意思?

registry.byId()函数将返回窗口小部件的实例。这包含来自小部件的setter / getters和其他内容。该模块应用于检索小部件,您无法使用它获取DOM节点。

另一方面,dom.byId()函数将返回匹配的DOM节点。您只能使用它来检索DOM节点。窗口小部件显然也包含DOM节点,但是您永远不应该直接访问窗口小部件的DOM节点,因为它们是窗口小部件内部结构的一部分(并且可能会更改)。

访问小部件时,始终使用registry.byId()。它提供了API来访问大多数DOM属性。


您的代码

因此,您的代码在此处演示了4种可能性。假设#myTextBox3是一个小部件(例如类型为dijit/form/TextBox)而#textNode3是一个DOM节点,则会发生以下情况:

  • dibiWidget工作,因为#myTextBox3是一个小部件。它将返回对该小部件的引用
  • dobiWidget可能正常工作,因为每个窗口小部件后面都有一个具有相同ID的DOM节点(不是必需的)。但是,就像我刚才解释的那样,不推荐使用它。
  • dibiDom无法正常工作,因为没有ID为#textNode3的小部件。这只是一个简单的DOM节点。
  • dobiDom将返回对DOM节点的引用,并工作

我还做了一个小JSFiddle来证明这一点。

答案 1 :(得分:3)

dom.byId()只是document.getElementById(...)的缩写。它返回对dom节点的引用。

registry.byId(...)返回对dojo注册表中包含的dojo小部件的引用。

例如,如果您有<div id='myDiv'></div>,则无法在此处调用registry.byId('myDiv'),因为它不是一个dojo小部件(因此不会在dojo注册表中)。您可以拨打dom.byId('myDiv')

现在,如果您有<div id='myDiv' data-dojo-type='dijit/layout/ContentPane'></div>,则可以同时拨打dom.byId('myDiv')registry.byId('myDiv')。一个获取dom节点,另一个获取dojo小部件。两者都有不同的方法,但如果有重叠,我通常会赞成registry.byId(...)

使用其中之一并不是一个优点,因为它们是不同的东西,用于不同的东西。

https://dojotoolkit.org/reference-guide/1.9/dijit/registry.html

http://dojotoolkit.org/reference-guide/1.9/dojo/dom.html