0

方法はありますか?

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

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

と を認識しpreventDefaultstopPropagationいます。イベントの外からやりたい。回答では、次のことを考慮してください。

  • これらのバインドされたイベントを変更できません。
  • バインドされたイベントがわかりません (可能ですが、それには長い時間がかかります)。そのため、.off() それらを 1 つずつ追加して戻すことはできません。
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 に答える