2009-07-18 5 views
2

私はボタンがある場合: グローバルセレクタを使用して、1つの要素を除くすべてのクリックイベントに応答するにはどうすればよいですか?

<button id="button1"> 

は、通常、私が書くでしょう:

$("#button1").click(function() 
{  
    //do something 
} 

をしかし、私は誰かがこのボタンをクリックしたときにを除き、すべてのクリックイベントに応答関数を定義します。

button1以外の文書内の他のすべてのクリック可能な要素をターゲットにするセレクタはありますか?

答えて

6

私はあなたが上記の答えを受け入れたことを知っていますが、私はこれに強くお勧めします。 イベントの委任を使用して、domへのオーバーヘッドを大幅に削減したいことができます。

.live()は存在しますが、ライブハンドラーが多すぎるとパフォーマンスにも影響します。私はイベント委任の古いスタイルを好む。

デモhere

$(function(){ 
    $('body').click(clickFn); 
    }); 

    function clickFn(ev) { 

    if (ev.target.id != 'button1'){ 
     //do your stuff 
     console.log('not a #button1 click'); 
    } 

    } 
+2

イベントデリゲーションはjQueryのライブ() - > http://docs.jquery.com/Events/live – James

+0

ですぐに焼き付けられますが、独自のオーバーヘッドがあります。 – redsquare

+0

ありがとうございます。私は自分のコードであなたのソリューションを実装しようとし始めましたが、私はあなたが使用した構文について混乱しています。私は私の混乱を明確にするために新しい質問を追加しました:http://stackoverflow.com/questions/1147864/correct-syntax-for-defining-an-event-delegator –

7

あなたは:not selectorを使用することができます。

$('button:not(#button1)').click(function(){ 
    //Do something 
}); 

上記セレクタは、ID =「ボタン1」と1を除く、全てのbutton要素にマッチします。

あなたが本当にbodyタグの下にあるすべての要素を選択したい場合は、あなたが"All"*)セレクタを使用し、また:not(selector)または.not(expr)で要素を除外することができます。

$('body *:not(#button1)').click(function(){ 
    //Do something 
}); 

それとも

$('body *').not('#button1').click(function(){ 
    //Do something 
}); 

イベントバブリングや伝播の問題が発生する可能性がありますが、これはevent.stopPropagation機能で処理できます。

+0

偉大な答え。ありがとう。 –

+0

よろしくお願いいたします。 – CMS

+3

良い解決策ではありません。 100回のクリックイベントが発生する可能性があります。イベントの委任はevent.targetをチェックするところでここで最もよいでしょう。 – redsquare

1

現在のCSS 3セレクタの候補推奨は、:root pseuedo classを定義しています。

:root疑似クラスは、ドキュメントのルートである要素を表します。 HTML 4では、これは常にHTML要素です。

イベントリスナーをルートに添付し、どの要素がクリックを受信したかを確認できます。それが戻り値を無視したい要素なら、それ以外の場合は何をしたいのかを行います。

+0

ブラウザが候補仕様であるかどうかに依存します。 –

+0

jQueryのようなJavaScriptライブラリによって提供されるセレクタエンジンはCSS 3セレクタを実装しています。ブラウザーではうまく実装されていないセレクターをjQueryで使用することができます。 –

+0

ご清聴ありがとうございます。私はそれがどのように機能するのか分からなかった。 –

関連する問題