查看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
最佳答案
var hellopuppy = dojo.query("[id='myId']",node);