2013-09-30 62 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/