【问题标题】:dojo.connect won't connect 'onclick' with buttondojo.connect 不会将“onclick”与按钮连接
【发布时间】:2011-03-01 19:21:18
【问题描述】:

我在使用 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;"}))
});

但是,不是在单击按钮时执行该函数,而是任何 onclick 事件都会触发该函数,并且我最终会得到很多子容器。

尽管我很确定 .connect() 函数应该作为 dojo 基本功能的一部分提供,但我已经明确“要求”它:

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

关于为什么会发生这种情况的任何想法?

【问题讨论】:

    标签: button dojo onclick connect


    【解决方案1】:

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

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

    .. 如果 dojo.connect 的第一个参数为 null,则将使用全局或“窗口”对象。

    但是,这只是一个错误。您的按钮元素正在小部件化,并变成 dijit.form.Button。所以你应该在这里连接到小部件的 onClick 方法,而不是节点的 onclick:

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

    另外,需要明确的是,您永远不需要 dojo.require dojo._base 中的任何内容,这是 dojo.js 对您做出的承诺 - 它全部捆绑在其中。

    【讨论】:

    • 谢谢,我对所有按钮进行了更改。但是有一个问题:使用 dojo.byId("x") 和 onclick 是有效的,那么为什么首选使用 dijit/onClick?
    【解决方案2】:

    回答我自己的问题:永远不要低估 dojo.addOnLoad 的价值!

    我觉得由于按钮被用作小部件,它的 ID 直到 Dojo 完成加载后才注册,并且由于连接代码不在 addOnLoad 块中,它找不到(还没有加载)按钮。那么,该方法在每个单击事件上触发的原因是 Dojo 在 connect() 函数中处理空对象的方式:它忽略它们,而是使用 dojo.global(Dojo 的 document.window 版本)作为对象。

    我希望这对可能遇到类似问题的其他人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      相关资源
      最近更新 更多