有没有办法。
$("#controlId").suspendEvents();
$("#controlId").resumeEvents();
我知道preventDefault
和stopPropagation
。我想从事件之外做。请在您的回答中考虑以下内容。
- 我无法修改这些绑定事件。
- 我不知道绑定的事件(尽管可能需要很长时间才能完成)。所以不可能
.off()
,然后将它们一一添加回来。
有没有办法。
$("#controlId").suspendEvents();
$("#controlId").resumeEvents();
我知道preventDefault
和stopPropagation
。我想从事件之外做。请在您的回答中考虑以下内容。
.off()
,然后将它们一一添加回来。我能够汇总其他 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 问题。
一切都会冒泡,所以抓住身体中的任何事件并阻止它们。
选择
var myCtlrs = $("all i want").attr("disabled", disabled");
然后
myCtlrs.removeAttr("disabled");