【问题标题】:Is dojo able to get all of events in whole page?dojo 是否能够获取整个页面中的所有事件?
【发布时间】:2011-02-23 10:12:05
【问题描述】:

有一些代码是这样依次执行的:

  1. dojo 为一个小部件设置值并触发 onchange 事件。
  2. dojo.connect 到上述小部件的 onchange 事件。

最初,我认为第 1 步的事件不会被第 2 步中设置的事件处理程序捕获。但是,看起来我的假设是错误的。

所以我的想法是尝试在 dojo.connect 之前获取所有事件并杀死所有事件,然后 dojo.connect 将无法使事件处理程序捕获以前发生的事件。

有没有可能是 dojo.stopAllEvent 之类的东西?之后,我的 dojo.connect 代码将正确忽略不必要的事件。

提前致谢。

【问题讨论】:

    标签: javascript dojo


    【解决方案1】:

    虽然我不知道标题问题的答案,但我想我会插话 onChange 的怪事。

    我会假设和您一样,但事实证明,当您设置表单小部件的值时,onChange 事件会在超时时触发。来自dijit.form._FormWidget

    // setTimout allows hidden value processing to run and
    // also the onChange handler can safely adjust focus, etc
    this._onChangeHandle = setTimeout(dojo.hitch(this,
        function(){
            this._onChangeHandle = null;
        this.onChange(newValue);
        }), 0); // try to collapse multiple onChange's fired faster than can be processed
    

    这意味着您的第 2 步继续进行并附加第二个 onChange 侦听器事件实际触发之前。您可以做些什么来解决您的问题,即使用set 方法的第三个参数。

    yourFormWidget.set("value", myNewValue, false);
    

    第三个参数称为priorityChange,设置为false时不会触发onChange事件。希望有帮助。 (感谢 #dojo 上的 kgf 教我 :-))

    【讨论】:

    • 谢谢。你真的很有帮助。
    【解决方案2】:

    如果您的实际问题只是在连接事件之前如何避免“听到”来自您的 set 呼叫的更改,那么一个潜在的答案基本上就在我告诉 Frode 的内容中,他之前转达了。

    dijit.form._FormWidget 通过超时触发onChange,这实质上确保它仅在当前函数链完成执行后才真正触发。因此,目前您的connect 最终实际上“赢得”了与onChange 射击的比赛,这是您不想要的。但是,您应该能够通过类似地在超时内执行实际连接来强制它“丢失”。

    示例:http://jsfiddle.net/kfranqueiro/ur8tf/

    当然,如果 Frode 的建议足以满足您的目的,那么它可能会更容易。

    【讨论】:

    • 谢谢。你真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2013-03-26
    • 2023-04-01
    • 2013-10-27
    相关资源
    最近更新 更多