1. ホーム
  2. jquery

[解決済み] クリックイベントが既にバインドされているかどうかを確認する方法 - JQuery

2022-06-12 11:59:25

質問

ボタンにクリックイベントをバインドしています。

$('#myButton').bind('click',  onButtonClicked);

あるシナリオでは、これは何度も呼び出されているので、私が trigger を実行すると、複数のajaxが呼び出されるのを防ぐことができます。

どのようにすれば bind を実行します。

どのように解決するのですか?

2012年8月24日更新 : jQuery 1.8では、要素のイベントにアクセスするために .data('events') . (参照 このバグ を参照してください)。 同じデータにアクセスするために jQuery._data(elem, 'events') これは文書化されていないため、100% 安定しているとは言えません。 しかし、これは問題ではなく、上記のプラグインコードの関連する行は、次のように変更することができます。

var data = jQuery._data(this[0], 'events')[type];


jQuery のイベントは events というデータオブジェクトに格納されているので、この中で検索することができます。

var button = $('#myButton');
if (-1 !== $.inArray(onButtonClicked, button.data('events').click)) {
    button.click(onButtonClicked);
}

もちろん、このコードが一度だけ呼ばれるようにアプリケーションを構成できれば、それが一番です。


これはプラグインにカプセル化することができます。

$.fn.isBound = function(type, fn) {
    var data = this.data('events')[type];

    if (data === undefined || data.length === 0) {
        return false;
    }

    return (-1 !== $.inArray(fn, data));
};

その後、呼び出すことができます。

var button = $('#myButton');
if (!button.isBound('click', onButtonClicked)) {
    button.click(onButtonClicked);
}