2016-06-21 4 views
0

私はajaxを使用していくつかのフォームを呼び出してから、各ボタンのイベントハンドラをバインドします。問題は...私はajaxを使用して新しいフォームを呼び出すと、新しい要素に対してイベントハンドラが再度呼び出され、前の要素に対して2回追加されます。イベントハンドラが既に要素上にあり、再度バインドしていないかどうかを検出するにはどうすればよいですか?これを行うには既にバインドされている場合はイベントハンドラをバインドしない

function x(){ 
    $("input:button").click(function(){ 
     alert('is this called once?'); 
    }); 
} 

<input type='button' value='Disable me' /> 
<input type='button' value='Disable me' /> 

function x(){ 
 
    $("input:button").click(function(){ 
 
     alert('is this called once?'); 
 
    }); 
 
} 
 

 
// calling event twice simulating an ajax calling: 
 
x(); 
 
x();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<input type='button' value='Disable me' /> 
 
<input type='button' value='Disable me' />

+3

イベントの委任を使用すると、イベントハンドラを一度設定するだけで済みます。 – Pointy

答えて

2

クリックハンドラは、実際にあなたのAJAXリクエストが呼び出されるたびに再追加する必要がありますか?ない場合は、そのようなあなたのコードを改訂検討してください。文書にハンドラをアタッチし、セレクタ('input:button')を供給することにより

//Only call this once; new buttons will still trigger it 
 
$(document).on('click', 'input:button', function() { 
 
    alert('is this called once?'); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type='button' value='Disable me' /> 
 
<input type='button' value='Disable me' />

、機能はボタンのみをクリックしたときにトリガしますが、自動的に初期バインディング後に追加された新しいボタンに適用されます。

+0

@Mike McCaughanは、すべてのイベントハンドラを削除するように警告しているので、これとA.Jの両方の答えが動作します。私は答えとして1つのマークを知らなかったので、これをマークします。君たちありがとう! – stramin

2

一つの方法は、接続されているすべてのイベントを削除し、それを添付するのjQueryのoff機能を使用しています。

これは、要素にクリックイベントが1つだけ接続されていることを確認します。

例スニペット:

function x() { 
 
    $("input:button").off('click').on('click', function() { 
 
    console.log('is this called once?'); 
 
    }); 
 
} 
 

 
// calling event twice simulating an ajax calling: 
 
x(); 
 
x();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type='button' value='Disable me' /> 
 
<input type='button' value='Disable me' />

+1

注意すべき点が1つあります。 'off( 'click')を使うと、セレクタでマッチした要素の*すべての*クリックイベントハンドラが削除されます。したがって、イベントハンドラを 'x'関数の外に付けると、それらも削除されます。削除するハンドラであるが、ハンドラに名前付き関数を使用する必要がある関数をとる 'off'のオーバーロードがあります。 –

+0

また、この答えには何も問題はないことに注意してください。ちょうど 'オフ 'を使用する際に留意すべきことです。 –

関連する問題