javascript - Dojo 按 ID 查询默认为 getElementById

标签 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 选择器引擎。文件的开头有一个“快速路径” 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/

相关文章:

javascript - 堆积条形图 : By Type and Quantity

javascript - 脚本文件中的函数未被调用

javascript - JavaScript 如何解释索引?

javascript - addEventListener() 仅适用于最后一个实例

javascript - 将按钮添加到跨度

javascript - 将 jQuery 代码转换为 Backbone.js 结构

javascript - Browserify 使用 Riot 自定义标签给出类型错误

javascript - 在页面正文中保持 jQuery .getJSON() 连接打开并等待?

javascript - Document.ready 说明?

jQuery:我可以遍历 not() 方法吗