2012-08-08 16 views
7

私は特定の要素にアラートを表示するには、このコードを使用しています:要素の子供のjQuery警告onclick?

$("#resultsBox").click(function (event) { 
    console.log('a'); 
    }); 

は、私はあなたが「#resultsBox」内側「李」要素をクリックした場合にのみ、アラートを表示したいです。

私はこのようにそれをやろうとしている

$("#resultsBox li").click(function (event) { 
    console.log('a'); 
    }); 

これは、要素の#resultsBox構造である:

<div id="resultsBox"> 
    <ul> 
    <li></li> 
    <li></li> 
    </ul> 
</div> 

はどのようにこれを行うことができますか?質問の編集後

+3

どうしたのですか?それは動作しませんか?それは.. – elclanrs

+0

そして?どうしたの?よく見えます。 – Strelok

+0

それはうまくいくはずです。おそらくあなたは 'li'要素を動的に追加していますか?あるいは、HTMLが無効で、何とかセレクタを台無しにしているのでしょうか? – jeff

答えて

15

あなたは.click()と、イベントハンドラをバインドすると、それはその瞬間ではなく、後から動的に追加された要素にあなたのセレクタをマッチした任意の要素に適用されます。

あなたのdivが「resultsBox」と呼ばれて考えると、あなたが実際にあなたが委任されたイベントハンドラを使用する必要があり、その場合には、いくつかの他の操作の結果を、表示するために動的にに物事を追加していると仮定するのが妥当と思われます

$("#resultsBox").on("click", "li", function (event) { 
    console.log('a'); 
}); 

.on() methodのこの構文はハンドラを「#resultsBox」にバインドしますが、クリックが発生すると、jQueryは2番目のパラメータの「li」セレクタに一致する子要素にあるかどうかをチェックします。それ以外の場合は機能しません。

+0

これは有効ですか? 'li'を選択し、第二引数に' li'を渡しますか? – Jashwant

+0

あなたの質問を編集しました。私のコメントは現在有効ではありません;) – Jashwant

+0

申し訳ありません@ジャシュワント、あなたは正しいですが、私はそのタイプミスに気付いて削除しました。 – nnnnnn

0

UPDATE:http://jsbin.com/ocejar/2/edit

しかし、いずれにせよ、上記のも、あなたの例を:

<div id="resultsBox"> 
    <ul id="myList"> 
    <li></li> 
    <li></li> 
    </ul> 
</div> 


$("#myList > li").click(function (event) { 

     console.log('a'); 

     }); 

Demo

+1

これは動作しません。 'li'は'#resultsBox'の直系子孫ではありません – Jashwant

+0

この質問は質問が編集される前に追加され、 '#resultsBox''の中の' li '要素をクリックすると言われました –

+0

あなたはいつもあなたの答えも編集できます:) – Jashwant

1

このような何かが

$("#resultsBox").find("li").click(function(){ 
    alert("You clicked on li " + $(this).text()); 
}); 

これは動作するはずですが動作するはずですを使用してはうまくいくはずです。 hereを参照してください。ただし、$("#resultsBox").find("li")を使用すると、パフォーマンス面ではlittle fasterになります。

+0

私はそれを試しただけで、クリックを捕まえていませんでした。私は要素の内容で質問を更新した可能性がありますそれは動作しない理由です。 – lisovaccaro

+0

@ Liso22それに応じて私の答えを更新しました – Juri

+0

質問のセレクタは、#resultsBoxの子孫(必ずしも直接的な子供ではない)であるli要素を探している '$("#resultsBox li ")...でした。質問のコードに '>'はありません。 – nnnnnn

0
$("#resultsBox").find('li').click(function (event) { 
    alert($(this).text()); 
    }); 
1

あなたのコードをあなたは動作する必要があります持っているように:http://jsfiddle.net/GxCCb/

その重要なコードが評価されるときににイベントハンドラをアタッチしようとしている要素が存在しなければならないことに注意すること。後で追加する場合は、on()(v1.7 +)またはdelegate()(< 1.7)を使用する必要があります。これは、イベントの委任に使用され、後で追加するとその要素を参照できるようになります。

()上を使用:

デリゲート()を使用してhttp://jsfiddle.net/7Lz2Y/

$("#resultsBox").on('click', 'li', function (event) { 
    alert(this.innerHTML); 
    }); 

デモ

$("#resultsBox").delegate('li', 'click', function (event) { 
    alert(this.innerHTML); 
    }); 

デモ:http://jsfiddle.net/XwYs5/

しかし、存在する要素のためのイベントハンドラを取り付けるための他の方法がたくさんある前:

$("#resultsBox").find('li').click(function (event) { 
    alert(this.innerHTML); 
    }); 

デモ:http://jsfiddle.net/74Q7p/

$("#resultsBox ul > li").click(function (event) { 
    alert(this.innerHTML); 
    }); 

デモ:http://jsfiddle.net/a28U5/

+0

コードが実行されているときに存在する必要がある要素は正しいですが、表示される2つの代替方法には同じ問題があります。 – nnnnnn

+0

@nnnnnn - 良い点として、私は 'on()'と 'delegate()'を使ってサンプルを追加しました。 – RobB

0

これはうまくいくはず。

$("#resultsBox ul li").click(function (event) { 
    console.log('a'); 
}); 
0

これは、動的に追加された要素に対して機能します。

+0

クロスブラウザですか? – Jashwant

+0

はい、javascriptでイベントをバインドしている間、event.targetはInternet Explorerで識別されません。 event.srcElementを検索します。これはjQueryで完全に処理されています。 – Ankur