查看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
答案 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);