4

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

例如,如果我这样做:

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. 如果我注释掉这个块,引擎会恢复使用 a 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

4 回答 4

3
 var hellopuppy = dojo.query("[id='myId']",node);
于 2013-09-12T20:47:25.223 回答
0

是的,似乎如果您为 指定上下文query('#myid', nodeInMemory),则不应使用document.etElementById()

解决方法是使用

dojo.query("[id='myid']", nodeInMemory);
于 2013-09-12T20:51:58.700 回答
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 元素。

于 2013-09-12T14:53:10.250 回答
0

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

于 2013-09-12T14:17:03.127 回答