2012-04-23 9 views
27

、のは、私がどこかで定義されたjQuery:イベントリスナーを追加すると、同じイベントの前のリスナーが上書きされますか?例えば

$(element).on('click', function() {/*Some Stuff*/}); 

を持って言わせて、その後私は、同じクリックイベントに多くの機能を追加したいです。私がする場合

$(element).on('click', function() {/*Other Stuff*/}); 

"その他のもの"は "いくつかのもの"を上書きしますか?

+0

はここhttp://stackoverflow.com/questions/891989/javascript-adding-an-onclick-handler-without-overwriting-the-existing-one –

+1

なぜdownvotesを見てみましょうか?問題ははっきりと簡潔です。 –

+0

Lol、私は盲目的にコードを書かずに、これが当てはまるかどうかわからない。もっと理にかなって私の質問を編集しました。 – trusktr

答えて

20

第2のリスナーは最初のリスナーを上書きしません。 jQueryイベントハンドラは、累積的に追加され、添付された順序で実行されます。

1つのハンドラは、他の実行を防止するかどうか効果がないものは機能がブラウザのデフォルトのクリックハンドラをキャンセルする方法である(つまり、あなたがリンクのURL以下のブラウザを停止する方法)

あなたは伝統的な方法で使用する場合:

$(element).on('click', function() { 

    /* Some Stuff, do your thing */ 

    return false; 
}); 

上記のハンドラはイベント自体を停止し、他のハンドラに伝播します。

しかし、あなたはその伝播またはハンドラを停止することなく、イベントのアクションを停止することができます:

$(element).on('click', function(e) { 

    // prevent the default action at first, just to make it clear :) 
    e.preventDefault(); 

    /* do your thing */ 

    return /* what you want */; 
}); 

これはデフォルトのクリックアクションが発生しないことが保証されますが、イベントは、他のhanldersし続けていること。 jQueryイベントには、他にも便利なものがあります。event propagation methods(例:Event.stopPropagation())は知る価値があります。

+1

ああ!それはそれを説明する。私はいつも.preventDefault()を使用して迷惑を掛けているのかどうか疑問に思った。 – trusktr

+0

まったく同じコールバックを2回追加するとどうなりますか?たとえば、次のようになります。 'jQuery(window).on(" scroll、MyClass.scroll ")'。そのテストはありますか? (私は一見見ることができると思う。) –

1

あなたは誤解しました。別のハンドラを追加しても最初のものは上書きされません。

このjsFiddleを参照してください:リンク上http://jsfiddle.net/ymuBs/

クリックすると、コンソールに "1" を書き込みます。ボタンをクリックすると、リンクに別のハンドラが追加されます。このリンクをクリックすると、コンソールに「1」と「2」が書き込まれます。

4

いいえいいえ。 on()はバインドと同じです - イベントを$.data("events")に追加します

off()で明示的に削除することはできますが、

0

これは既に回答済みですが、クリックリスナーを重複させる可能性がある状況でこの問題に対処する方法を追加すると思いました。

Iと方法オフ上だけでのユーザークエリ...

$(要素)。オフ( 'クリック'); //は

$(要素).on( 'クリック'、関数(){/ いくつかのもの /})方法でを使用して以前に追加クリックリスナーを削除。 //戻ってそれを追加し、一度だけ

http://api.jquery.com/off/

.off()メソッドを.onに添付されたイベントハンドラを削除する実行します()。詳細については、そのページの委任された直接のイベントについての説明を参照してください。引数なしで.off()を呼び出すと、要素にアタッチされているすべてのハンドラが削除されます。特定のイベントハンドラは、イベント名、名前空間、セレクタ、またはハンドラ関数名の組み合わせを提供することで、要素上で削除できます。複数のフィルタリング引数が指定された場合、提供されるすべての引数は、削除されるイベントハンドラと一致する必要があります。

+0

これは実際に質問に答えるものではありません。それは単に提案されたテクニックを提供します。問題はすでに明らかに答えられていた。この質問ゲームでは、新しい方法で質問に答えるか、アップフォートが必要な場合には、まだ提供されていなかった追加情報を提供していると言います。 – joshp

+0

良い点ジョシュ、私はランキングを探していませんでした。私はこの問題を研究していて、他の人も同様に知りたいと思っていたので、これを見つけました... –

+0

理解しています。私はあなたがサイトの初心者なので、コメントを投稿しただけです。 – joshp

関連する問題