Javascript 如何临时禁用附加到控件的所有事件处理程序

Javascript 如何临时禁用附加到控件的所有事件处理程序,javascript,jquery,Javascript,Jquery,有办法吗 $("#controlId").suspendEvents(); $("#controlId").resumeEvents(); 我知道preventDefault和stopPropagation。我想在活动之外做些什么。 请在下面的回答中考虑以下问题: 我无法修改这些绑定事件 我不知道绑定事件(尽管可能需要很长时间才能完成)。因此,不可能.off()然后逐个添加它们 所有东西都会起泡,所以抓住身体中的任何事件并加以预防 另类 var myCtlrs = $("all i wan

有办法吗

$("#controlId").suspendEvents();

$("#controlId").resumeEvents();
我知道
preventDefault
stopPropagation
。我想在活动之外做些什么。 请在下面的回答中考虑以下问题:

  • 我无法修改这些绑定事件
  • 我不知道绑定事件(尽管可能需要很长时间才能完成)。因此,不可能
    .off()
    然后逐个添加它们

所有东西都会起泡,所以抓住身体中的任何事件并加以预防

另类

var myCtlrs = $("all i want").attr("disabled", disabled");
然后


我能够把另外两个问题的答案放在一起

一,

二,

其思想是将带有
e.stopImmediatePropagation
的事件处理程序绑定到所有事件的队列前面。如果能改进,我会很高兴的

解决方案

$.fn.preBind = function (type, data, fn) {
    this.each(function () {
        var $this = $(this);

        $this.bind(type, data, fn);

        $.each(type.split(/ +/), function () {
            var currentBindings = $this.data('events')[this];
            if ($.isArray(currentBindings)) {
                currentBindings.unshift(currentBindings.pop());
            }
        });
    });
    return this;
};

$.fn.suspendEvents = function () {
    this.preBind("click keydown keyup keypress mouseover mouseenter  mouseout mouseleave mousedown mouseup mousemove change blur focus focusin focusout scroll resize load unload beforeunload", null, blockEvents);
}

$.fn.resumeEvents = function () {
    var _this = this;
    $.each("click keydown keyup keypress mouseover mouseenter  mouseout mouseleave mousedown mouseup mousemove change blur focus focusin focusout scroll resize load unload beforeunload".split(/ +/), function () {
        _this.unbind(this, blockEvents);
    });
}

function blockEvents(e) {
    e.stopImmediatePropagation();
}
现在我可以用

$("#controlId").suspendEvents();
$("#controlId").resumeEvents();

编辑:修改了
resumeEvents()
以克服IE问题。

当它冒泡时,它已经执行了吗?或者我遗漏了什么。是的,你是对的,但我认为你不希望发生链接执行或提交…@Luke disabled元素似乎是最简单的方法,但是你应该使用.prop('disabled',true)和.prop('disabled',false),这是预先设定的方法,你可以使用任何你想要的方式,jquery我的风格,jquery你的风格,香草风格。有很多可能性。但我们并不是在讨论首选的编码样式。@Luke我认为禁用元素对我来说不起作用,因为我在代码中找到了脚本触发器。虽然您可以遍历$.\u data(elem,'events')对象,该对象包含使用jquery绑定的所有事件,但不支持使用公共方法。对于检查使用本机javascript绑定的事件,如果使用内联绑定事件,您可以检查相应的属性,我不知道这是否适用于任何其他未经测试的javascript绑定处理程序方法。@谢谢。我会调查的。
$("#controlId").suspendEvents();
$("#controlId").resumeEvents();