Javascript Dojo按ID查询默认为getElementById

Javascript Dojo按ID查询默认为getElementById,javascript,jquery,dom,dojo,Javascript,Jquery,Dom,Dojo,通过查看Dojo库中Dojo/query的代码,如果传入的选择器是ID选择器,则它们似乎默认使用document.getElementById 例如,如果我这样做: query("#myId") 这将在幕后运行: document.getElementById("myId") 这对于查询窗口文档中的节点很好,但是如果您正在构建尚未放入文档中的节点呢?如果我在内存中构造一个节点,以便稍后放入DOM,并且我需要通过ID查询该节点,那么我不能这样做。因为此节点尚未在文档中 我知道jQuery也是这

通过查看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构造在DOM外部创建节点,该节点的所有者文档仍然是window.document。换言之:

var node = domConstruct.toDom('<div><p><span id="myId">Content</span></p></div>');

var doc = node.ownerDocument;

因为Dojo的代码查找“node”的所有者文档,这也是窗口。document

如果该节点还不在DOM中,则无法使用Dojo的
查询
选择器访问它。但是,如果节点在dijit注册表中,您可以使用
dijit.registry.byId()访问它,这可能是一种黑客行为,但可能对您有所帮助

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元素。

是的,如果您为
查询('#myid',nodeInMemory)
指定上下文,则它不应使用
文档.etElementById()

 var hellopuppy = dojo.query("[id='myId']",node);
解决方法是使用

dojo.query("[id='myid']", nodeInMemory);

感谢您的回复,但这对我没有帮助,因为此节点不在注册表中。这根本不是dijit。为什么要搜索一个还不存在的节点?您是否要在上下文节点中搜索?如果是这样,您可以在dojo.query中将节点作为参数传递。查询(选择器,节点)我是,是的。是的,您可以传递尚未在DOM中的节点,但即使在该实例中,该节点的所有者文档仍然是window.document本身。如果我使用domConstruct在Dojo中创建一个节点,然后在该节点上执行“node.ownerDocument”,则返回的文档是浏览器中的window.document。由于该节点还不存在,document.getElementById失败。
context
参数的问题是它也必须是DOM元素,因此如果该节点仅在内存中,则无法使用它。是的,您是正确的。请看我上面的编辑。是的,这很有效。非常感谢。与使用数据属性相比,我更喜欢这种方法。非常感谢。与使用数据属性相比,我更喜欢这种方法(我接受了我首先阅读的方法)。
dojo.query("[id='myid']", nodeInMemory);