2013-09-30 64 views
3

我正在研究一个像JavaScript元素选择器的萤火虫,但无法弄清楚如何在点击时停止所有JavaScript事件触发。萤火虫精简版插件(https://getfirebug.com/firebuglite)正在做我想要的,但无法弄清楚他们在做什么。 任何帮助,将不胜感激。防止所有JavaScript事件发生

塞纳里奥:

  • 用户选择元素检查元素
  • 用户点击
  • 的onClick,鼠标按下,鼠标松开应该不火

我都试过,没有运气以下:

function stopEvents(el){ 

    for(var key in window) { 
     if (key.indexOf("on") == 0) 
      el.addEventListener(key.substr(2), stop, false); 
    } 
} 

function StopEvent(pE) 
{ 
    stopEvents(pE); 

    if (!pE) 
    if (window.event) 
     pE = window.event; 
    else 
     return; 
    if (pE.cancelBubble != null) 
    pE.cancelBubble = true; 
    if (pE.stopPropagation) 
    pE.stopPropagation(); 
    if (pE.preventDefault) 
    pE.preventDefault(); 
    if (window.event) 
    pE.returnValue = false; 
    if (pE.cancel != null) 
    pE.cancel = true; 
} 

编辑:

$('.somediv').on("click", function(e){ 
    //Stop bubbling and propagation 
    StopEvent(e); 

    //EDIT: Still not working with this 
    e.stopImmediatePropagation(); 

    //RUN only my code here 
    console.log("My code is running still"); 

    return false; 
}); 

如果有另一个库,如YUI绑定事件到同一个DOM元素。它会在我的后面开火。我似乎无法劫持事件来阻止这种情况的发生。

编辑:

因为我需要能够激发我的活动我不能使用禁用的。如果我做了以下事情,我将无法启动上述事件。我无法附加父事件,因为DOM将停止触发该节点的树上的所有事件。

$('.somediv').on("mouseover", function(e){ 
    $(this).attr("disabled", "disabled"); 
}); 

编辑:

我想禁用已创建我的脚本运行前的事件。这些事件可以是任何JavaScript库,如YUI,Dojo,jQuery,JavaScript等......

+2

你尝试返回false?返回false;最后。 – Jeffpowrs

+1

你不能劫持所有事件。但是尝试在'document'的捕获阶段''.stopImmediatePropagation()'。 – Bergi

+0

'disabled'元素不会触发事件。 – Sebas

回答

3

如果不拦截实际的事件绑定,则不能“禁用”所有这些事件,因此您必须最终像这样的东西:

(function(prototypes) { 
    prototypes.forEach(function(prototype) { 
    var eventTracker = {}; 

    var oldAEL = prototype.addEventListener; 
    prototype.addEventListener = function(a,b,c) { 
     if (!eventTracker[a]) { eventTracker[a] = true; } 
     return oldAEL.call(this, a, function(evt) { 
     console.log(a, eventTracker[a]); 
     if(eventTracker[a] === true) { 
      b(evt); 
     } 
     },c); 
    }; 

    prototype.toggleEvent = function(name, state) { 
     eventTracker[name] = state; 
    }; 
    }); 
}([Document.prototype, HTMLElement.prototype, ...])); 

例如:http://jsfiddle.net/BYSdP/1/

按钮获得三个点击监听器,但如果点击第二个按钮,用于“点击”事件稳压器设置为false,所以没有的事件实际上会触发最初提供的代码。请注意,这也使得很难调试很多,因为你正在将处理程序封装在匿名函数中。

0

禁用页面上的所有事件非常简单。难的部分是在需要时恢复它们。

document.body.innerHTML = document.body.innerHTML; 

这将通过用DOM的“处女”副本替换DOM来有效地移除绑定到DOM节点的所有事件。

大部分时间用户甚至不会注意到重绘。

0

event.stopImmediatePropagation()保持处理程序的其余部分不被执行,并防止事件冒泡DOM树。

例子:

$("p").click(function(event) { 
    event.stopImmediatePropagation(); 
}); 

$("p").click(function(event) { 
    // This function won't be executed 
    $(this).css("background-color", "#f00"); 
}); 

来源:https://api.jquery.com/event.stopimmediatepropagation/