目前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');});
这样它就取代了现有的“点击”功能。事件处理程序并添加一个新的。
有没有办法达到我想要的目的?
谢谢!
答案 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');});
希望有所帮助:)