dojo如何覆盖事件处理程序

时间:2014-07-25 06:10:02

标签: javascript events dojo

目前dojo使用on方法将事件连接到处理程序。

btn = new Button();
btn.on('click', function () {console.log('do something');});

这将在单击按钮时调用附加功能。

但是,根据文件,删除现有的处理程序应按以下方式进行

handler = btn.on('click', function () {console.log('do something');});
handler.remove();

这不是我想删除事件处理程序的方式。

我没有将处理程序引用存储在任何地方。但我想添加一个新的点击'事件

btn.on('click', function () {console.log('do something different');});

这样它就取代了现有的“点击”功能。事件处理程序并添加一个新的。

有没有办法达到我想要的目的?

谢谢!

2 个答案:

答案 0 :(得分:2)

这是不可能的,框架告诉你通过创建对事件处理程序的引用来做到这一点。这类似于jQuery等其他框架的工作方式。

jQuery当然有一种机制可以使用off()函数删除所有事件处理程序,但这在Dojo中也不可用。就像Chris Hayes在评论中建议的那样,您可以自己实现这样的功能,或者将其包装在另一个模块中,或者使用dojo/on模块上的方面。

例如,您可以将其包装在新模块中:

// Saving the event handlers
var on2 = function(dom, event, callback) {
    on2.handlers = [];

    if (on2.handlers[event] === undefined) {
        on2.handlers[event] = [];   
    }
    var handler = on(dom, event, callback);
    on2.handlers[event].push({
        node: dom,
        handler: handler
    });
    return handler;
};
// Off functionality
lang.mixin(on2, on, {
    off: function(dom, event) {
        if (this.handlers[event] !== undefined) {
            array.forEach(this.handlers[event], function(handler) {
                if (handler.node === dom) {
                    handler.handler.remove();   
                }
            });
        }
    }
});

然后你可以使用它:

on2(dom.byId("test"), "click", function() {
    console.log("test 1 2 3"); // Old event handler
});
on2.off(dom.byId("test"), "click"); // Remove old event handlers
on2(dom.byId("test"), "click", function() {
    console.log("test 4 5 6"); // New event handler
});

这应该可以正常工作,正如你在这个小提琴中看到的那样:http://jsfiddle.net/X7H3F/

答案 1 :(得分:-1)

btn = new Button();
btn.attr('id','myButton');
query("#myButton").on('click', function () {console.log('do something');});

当您想要替换处理程序时执行相同的操作。喜欢,

query("#myButton").on('click', function () {console.log('do something different');});

希望有所帮助:)