Dojo查询ID默认为getElementById

时间:2013-09-12 13:54:04

标签: javascript jquery dom dojo

查看Dojo库中的dojo / query代码,如果传入的选择器是ID选择器,它们看起来默认使用document.getElementById

例如,如果我这样做:

query("#myId")

这将在幕后运行:

document.getElementById("myId")

这对于查询窗口文档中的节点很好,但是如果要构建尚未放入文档的节点呢?如果我在内存中构建一个节点以便稍后放入DOM,我需要通过ID查询该节点,我不能这样做。因为此节点尚未在文档中。

我知道这也是jQuery如何做到这一点,但jQuery是不同的,因为ID或不同选择器(类,属性等)查询的方法无论如何都是一样的。例如:

$("#myId")
$(".myClass")
$("div[align=center]")

方法是一样的。因此,在这种情况下默认为document.getElementById对我来说没问题。

使用Dojo,由于Dojo提供了一个单独的函数作为getElementById (dom.byId)的别名,因此它具有相当的误导性。如果我想要ID查询实际文档,我会使用它。如果我正在使用选择器的dojo / query,那么我希望能够查询文档或上下文节点。

在可用的原生选择器引擎可用的情况下,Dojo使用 lite.js 选择器引擎。文件的开头有一个“快速路径”块,实际上默认为dom.byId。如果我注释掉这个块,引擎将恢复使用querySelectorAll,这反过来又解决了这个问题。

任何人都可以解释Dojo这样做的原因吗?或者,如果有一个可行的解决方法,不需要我评论Dojo的代码?我见过的一种方法是使用数据属性来代替ID,这会伪造引擎,但这看起来很蹩脚。

修改

注意:您可以在查询时将上下文节点传递给dojo / query,但是在Dojo中,即使使用dom-construct在DOM外部创建节点,该节点的ownerDocument仍然是window.document。换句话说:

var node = domConstruct.toDom('<div><p><span id="myId">Content</span></p></div>');

var doc = node.ownerDocument;

将导致'doc'成为window.document。所以,做一些像:

doc.getElementById("myId")将失败。就像这样:

var results = query("#myId", node);

因为Dojo的代码查找'node'的ownerDocument,它再次是window.document

4 个答案:

答案 0 :(得分:2)

 var hellopuppy = dojo.query("[id='myId']",node);

答案 1 :(得分:0)

如果该节点尚未在DOM中,则无法使用Dojo的query选择器访问该节点。但是,如果节点位于dijit注册表中,则可以使用dijit.registry.byId(<id>)访问它。

答案 2 :(得分:0)

这可能是一个黑客,但也许它可以帮助你,

function foo(){
    this.bar = bar();
    bar.[access the properties of the div here]
}

function bar(){
   this.somenode = document.createElement("div");
   return this.somenode;
}

您可以访问div的属性,在本例中为bar,而不将其添加到页面中,bar()中的“somenode”可以是任何有效的html元素。

答案 3 :(得分:0)

是的,好像您为query('#myid', nodeInMemory)指定了一个上下文,它不应该使用document.etElementById()

解决方法是使用

dojo.query("[id='myid']", nodeInMemory);