0

有没有办法。

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

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

我知道preventDefaultstopPropagation。我想从事件之外做。请在您的回答中考虑以下内容。

  • 我无法修改这些绑定事件。
  • 我不知道绑定的事件(尽管可能需要很长时间才能完成)。所以不可能.off() ,然后将它们一一添加回来。
4

2 回答 2

1

我能够汇总其他 2 个问题的答案。

1.将事件处理程序绑定到队列的前面

2.将处理程序附加到控件中的所有事件

这个想法是将事件处理程序绑定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 问题。

于 2013-06-18T11:07:08.713 回答
0

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

选择

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

然后

myCtlrs.removeAttr("disabled");
于 2013-06-18T08:59:29.960 回答