dojo.connect无法连接'onclick'和按钮

olmpazwi  于 2023-10-14  发布在  Dojo
关注(0)|答案(2)|浏览(240)

我在使用dojo.connect()连接一个'onclick'事件和这个按钮时遇到了一个问题:

<button dojoType="dijit.form.Button" widgetId="inbox_button" id="inbox_button">Inbox</button>

连接的代码是:

var inbox_button=dojo.byId("inbox_button");
dojo.connect(inbox_button,'onclick',function(){
    var container=dijit.byId("center");
    container.addChild(new dijit.layout.ContentPane({region: "left", content: "...", style: "width: 100px;"}))
});

然而,当按钮被点击时,ANY onclick事件触发函数,而不是执行函数,我最终得到了很多子容器。
尽管我非常确定.connect()函数应该作为dojo的基本功能的一部分,但我已经明确地“要求”它:

dojo.require("dojo._base.connect");

你知道为什么会这样吗?

9njqaruj

9njqaruj1#

正如您所说,如果在DOM准备好之前运行该代码,dojo.byId(“inbox_button”)将返回null。所以你的连接实际上是在做:

dojo.connect(null, "onclick", function() { ... })

..如果dojo.connect的第一个参数为null,则将使用global或'window'对象。
但是,这只是这里的一个错误。您的button元素正在被小部件化,并变成了dijit. form. Button。所以你应该在这里连接到小部件的onClick方法,而不是节点的onclick:

dojo.connect(dijit.byId("inbox_button"), "onClick", function() { ... });

另外,要明确的是,你永远不应该在dojo._base中要求dojo.require任何东西,这是dojo.js对你的承诺-它全部捆绑在一起。

yyhrrdl8

yyhrrdl82#

回答我自己的问题:永远不要低估dojo.addOnLoad的价值!
我觉得由于按钮被用作一个小部件,它的ID直到Dojo完成加载之后才被注册,并且由于连接代码不在addOnLoad块中,所以它找不到(尚未加载的)按钮。那么,该方法在每个点击事件上触发的原因是Dojo在connect()函数中处理null对象的方式:它会忽略它们,而是使用dojo.global(Dojo的document.window版本)作为对象。
我希望这能帮助任何可能遇到类似问题的人!

相关问题