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

use*_*145 11 dojo

registry.byIddom.byIddojo有什么区别?使用有什么好处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>";
});
Run Code Online (Sandbox Code Playgroud)

g00*_*00b 8

这些模块具有不同的用途.所以使用registry.byId()(或dom.byId())没有优势,因为它们在用例上有所不同.

的dijit /注册表中:byId()

dijit/registry模块的主要用途是检索小部件实例.引用参考指南:

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

道场/ DOM :: byId()

dojo/dom另一方面,模块只是一个访问DOM节点模块.引用的信息byId()参考指南:

这是一个简单的别名document.getElementById,它不仅写入更短,而且幸运的是适用于所有浏览器.它将domNode引用转换为某个Node byId,或者如果传递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来证明这一点.


Sho*_*hoe 4

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')and 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