停止所有事件的传播

alh*_*alh 10 javascript jquery

我正在呼吁e.stopPropagation()我目前申请的所有事件.有没有办法只停止每个事件的传播而不必在每个函数体的开头显式调用该方法?

Ale*_*lex 11

您可以绑定所有事件(删除您不需要的事件):

$('*').bind('blur change click dblclick error focus focusin focusout hover keydown keypress keyup load mousedown mouseenter mouseleave mousemove mouseout mouseover mouseup resize scroll select submit', function(event){
    event.stopPropagation();
});
Run Code Online (Sandbox Code Playgroud)

jQuery Docs上查看可能的事件


Pra*_*obh 5

不,它不能在全球宣布

event.stopPropagation()方法停止将事件冒泡到父元素,从而阻止执行任何父事件处理程序.

例如,如果在DIV或FORM中附加了单击方法的链接也附加了单击方法,则会阻止DIV或FORM单击方法触发.

http://api.jquery.com/event.stopPropagation/


Flo*_*loG 5

以 Alex 的响应为基础,在 vanilla JS 和更多事件(我能找到的所有键盘和点击事件)中:

/**
 * Disable all user events on the page
 *
 * @returns {function()} a function to cancel the disabling
 */
const disableAllUserEvents = () => {
    const events = ["click", "contextmenu", "dblclick", "mousedown", "mouseenter", "mouseleave", "mousemove",
        "mouseover", "mouseout", "mouseup", "keydown", "keypress", "keyup", "blur", "change", "focus", "focusin",
        "focusout", "input", "invalid", "reset", "search", "select", "submit", "drag", "dragend", "dragenter",
        "dragleave", "dragover", "dragstart", "drop", "copy", "cut", "paste", "mousewheel", "wheel", "touchcancel",
        "touchend", "touchmove", "touchstart"];

    const handler = event => {
        event.stopPropagation();
        event.preventDefault();

        return false;
    };

    for (let i = 0, l = events.length; i < l; i++) {
        document.addEventListener(events[i], handler, true);
    }

    return () => {
        for (let i = 0, l = events.length; i < l; i++) {
            document.removeEventListener(events[i], handler, true);
        }
    };
};
Run Code Online (Sandbox Code Playgroud)

编辑:只要知道这不是一个安全的解决方案,因为可以检索和取消这些事件:使用 Chrome 的 webkit 检查器删除事件侦听器