代码之家  ›  专栏  ›  技术社区  ›  Psytronic

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

  •  0
  • Psytronic  · 技术社区  · 15 年前

    我有一个启动/停止计时器的按钮。当我单击它时,我会删除当前的事件处理程序,并附加另一个。也就是说,单击“停止”,然后附加“启动”功能,以便下次单击。

    但是在IE(7)中,不确定大约8。新附加的事件也会在原始功能完成后触发:

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

    我知道这与附加事件位有关,因为如果我移除它,启动事件就不会触发。

    这似乎有点奇怪,因为我在“start”函数中有相同的情况,即“start”被删除,“stop”被调用。但谢天谢地,这似乎不会导致无限循环。

    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、protype等的答案。我不想为这个项目集成它。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Sean Kinsey    15 年前

    您可能应该改用切换方法: 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);