查看 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 选择器引擎。文件的开头有一个“快速路径” block ,它实际上默认为 dom.byId
。如果我注释掉这个 block ,引擎将恢复使用 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);
关于javascript - Dojo 按 ID 查询默认为 getElementById,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18766246/