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