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

时间:2013-06-18 08:56:35

标签: javascript jquery

有办法吗?

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

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

我知道preventDefaultstopPropagation。我想在活动之外做。 请在答案中考虑以下内容。

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

2 个答案:

答案 0 :(得分:0)

一切都在冒泡,所以要抓住身体中的任何事件并阻止它们。

替代

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

然后

myCtlrs.removeAttr("disabled");

答案 1 :(得分:0)

我能够将其他两个问题的答案放在一起。

1。Bind an event handler to front of the queue

2。Attach handler to all events in a control

我们的想法是将一个带有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问题。