如果事件与当前事件相同,则附加事件触发

时间:2010-05-26 20:24:56

标签: javascript event-handling cross-browser

我有一个启动/停止计时器的按钮。当我单击它时,我删除当前的事件处理程序,并附加相反的事件处理程序。即,单击“停止”,并为下一次单击附加“开始”功能。

但是在IE(7)中,不确定是8.在原始函数完成后,新附加的事件也会触发:

IE7中的生命线:
按下按钮 - > “停止”功能开始 - >删除“停止”功能 - >附加“开始”功能 - > “停止”功能完成 - >调用“开始”功能。

我知道它与附加事件位有关,因为如果我将其删除,则不会触发Start事件。

这看起来有点奇怪,因为我在“开始”功能中有相同的情况,即“开始”被删除,“停止”被调用。但幸运的是,这似乎并没有引起无限循环。

if(btn.attachEvent){
  btn.detachEvent("onclick", stop);
  btn.attachEvent("onclick", start);
}else if(btn.addEventListener){
  btn.removeEventListener("click", stop, true);
  btn.addEventListener("click", start , true);
}

在FF和Chrome中一切正常。我已经改变了附加/分离的顺序,只是为了看它是否有所作为,但事实并非如此。

附录 对不起,没有涉及jQuery,Protoype等的答案。这不是我想为这个项目整合的东西。

1 个答案:

答案 0 :(得分:2)

您应该使用切换方法:http://jsfiddle.net/QRYsS/

// get a cross-browser function for adding events, place this in [global] or somewhere you can access it
var on = (function(){
    if (window.addEventListener) {
        return function(target, type, listener){
            target.addEventListener(type, listener, false);
        };
    }
    else {
        return function(object, sEvent, fpNotify){
            object.attachEvent("on" + sEvent, fpNotify);
        };
    }
}());

var toggle = (function(){
    var state = false;
    return function(){
        state = !state;
        if (state) {
            alert("foo");
        }else{
            alert("bar");
        }
    };
})();

on(btn, "click", toggle);