dojo中registry.byId和dom.byId的区别?使用 registry.byId 有啥好处?

Posted

技术标签:

【中文标题】dojo中registry.byId和dom.byId的区别?使用 registry.byId 有啥好处?【英文标题】:Difference between registry.byId and dom.byId in dojo? What is the advantage of using registry.byId?dojo中registry.byId和dom.byId的区别?使用 registry.byId 有什么好处? 【发布时间】:2014-04-29 22:27:20 【问题描述】:

道场中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>";
);

【问题讨论】:

【参考方案1】:

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

dijit/registry::byId()

dijit/registry 模块的主要用途是检索 widget 实例。引用reference guide:

dijit/registry 将所有 dijit 小部件的集合存储在一个 页。它通常用于从 相关数据

道场/dom::byId()

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

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

什么意思?

registry.byId() 函数将返回您的小部件的一个实例。这包含来自小部件的 setter/getter 和其他东西。该模块应该用于检索小部件,您无法使用它获取 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 来演示一下。

【讨论】:

【参考方案2】:

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

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

例如,如果您有&lt;div id='myDiv'&gt;&lt;/div&gt;,则不能在此处调用registry.byId('myDiv'),因为它不是dojo 小部件(因此不在dojo 注册表中)。您可以拨打dom.byId('myDiv')

现在如果您有&lt;div id='myDiv' data-dojo-type='dijit/layout/ContentPane'&gt;&lt;/div&gt;,您可以同时调用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

【讨论】:

感谢您的回答。这真的很有帮助。我有一个 id=something 的图像,我正在使用 on(dom.byId("something"),"click",function() 但不是这个,而是我尝试创建一个按钮 @user3587145 如果要使用registry.byId,请确保您的标签具有data-dojo-type。如果是按钮,则需要dijit/form/Button 谢谢你...并且使用注册表有任何好处吗?有人告诉我只使用注册表而不是 dom。 @user3587145 就像我在回答中所说的那样,它用于不同的事情。通常,您需要小部件参考,以便您注册。但是当您需要 dom 节点,或者您正在使用的元素不是 dojo 小部件时,dom.byId 可以使用它。我还建议更好地格式化您的问题,使其符合网站的标准。这就是为什么你被否决的原因。看看这里的提示。 ***.com/help/how-to-ask 谢谢。我尝试使用推荐的,而不是 dom.byId("something") ,我使用了注册表,但它仍然不起作用。

以上是关于dojo中registry.byId和dom.byId的区别?使用 registry.byId 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

推迟 Dojo Deferred

自定义小部件内的 dojo 小部件的可寻址性

为啥 on-change 事件在下拉列表中工作一次?

Dojo dojo.rawXhrPost 和 dojo.xhrPost

Dojo 和模板解决方案

您可以同时使用 Dojo.Build 和 CDN 吗?