2012-03-01 7 views
0

"navigation" divでクリックされた要素のhrefタグを取得しようとしています 現在のコードは、ナビゲーションdivでクリックした要素に関係なく毎回#BiblesandCommentariesを返します。クリック時のhrefタグの取得

<div class="navigation"> 
     <ul> 
      <li><a href="#BiblesandCommentaries">الانجيل-تعليقات</a> </li> 
      <li><a href="#EnquirersLibrary">الاستفسارات</a> </li> 
      <li><a href="#NewBelievers">مؤمنون جدد</a> </li> 
      <li><a href="#ChristianLiving">حياة المسيحى</a> </li> 
      <li><a href="#FamilyLibrary">مكتبة الأسرة</a> </li> 
      <li><a href="#YoungAdultLibrary">مكتبة الشباب</a> </li> 
      <li><a href="#WorshipLibrary">مزامير وتراتيل</a> </li> 
      <li><a href="#BibleTeachings">التدريس</a> </li> 
      <li><a href="#Leadership">القيادة</a> </li> 
      <li><a href="#SchoolofChrist">مدرسة الإنجيل</a> </li> 
      <li><a href="#Dota">شاگرد سازی بصورت شنیدن</a></li> 
      <li><a href="#MinorityLanguages">فهم المسيح</a> </li> 
     </ul> 
    </div> 

jsのような.find().attr()を使用して

$('.navigation').click(function() { 
    test = $(this).find('a').attr('href'); 
    alert (test); 
}); 
+0

あなたが「ナビゲーション」内にあり、最初のマッチケースで.find()が停止するので、最初のものが得られる理由は、毎回最初のものです。 – Relic

+0

@Relic実際には '.find'はすべてのマッチを取得します。それは最初のマッチで停止する '.attr'です。 – Blazemonger

+0

@ mblase75右、それは返される配列の最初の部分をシフトしています。私の悪い... – Relic

答えて

7

HTMLは常に最初の1を取得します、あなたはこのようなaをターゲットに、あなたのclick機能するためのセレクタを変更する必要があります。

$('.navigation a').click(function(e) { 
    e.preventDefault(); //use this if you don't want to reload the page 
    var test = $(this).attr('href'); 
    alert (test); 
}); 

また、宣言する必要がありますあなたの変数。

EDIT OKコメンターが、私はちょうど彼のコードを修正しましたが、ここ屋に行く:

$('.navigation a').on("click",function(){ 
     alert($(this).attr('href')); 
}); 

EDITハハのコメンター、の知識をひけらかす取得してみましょう:

$("div.navigation").on("click", "a", function(e) { 
    e.preventDefault(); 
    alert ($(this).attr('href')); 
});​​​​ 

デフォルトを防止することなく、タグを操作すると、ページがリロードされます

EDIT:それ以上のステップを踏みたいですか? jQueryを忘れる。ここではいくつかのvanilla JS

document.querySelector("div.navigation").onclick = function(e){ 
    if(e.target.href){ 
     e.preventDefault(); 
     alert(e.target.href); 
    } 
} 
+0

が完璧です。ありがとうございました! – Blainer

+0

ここで変数を宣言してはいけません。ここではjQueryオブジェクトを1回だけ使用します...また、DOMを監視しないため、避けることができるところでは'click() 'を使用しないでください新しい要素のために。このコードが実行されたときに存在するもののみ。 – Relic

+0

これはハンドラを個々のアンカーに個別にバインドしますが、不要で遅くなります(ただし違いは目に見えない可能性があります)。 – Mathletics

0

.navigationは一つだけ(UL)であるのです。全体的にあなたがベストプラクティスのためにこれを試してみてください

$('.navigation a').click(function() { 
    var test = $(this).attr('href'); 
    alert (test); 
}); 
3

のようなものを試してください:あなたは、同じ要素に対して複数回DOMを解析する必要がない限り

$('div.navigation').on("click", "a", function() { 
    alert($(this).attr('href')); 
}); 

は、メモリ内の変数を設定しないようにしよう、覚えておいてください。また、できるだけ多くの深さをjQueryセレクタに与えてみてください。解析するDOMを少なくしてください。それが理にかなっていない場合は、このように考えてください。それは、クラス 'ナビゲーション'のdivタグのみを解析する必要がある場合、他のタグをすべて削除し、そのクラス属性のすべてのタグを解析するよりもはるかに時間がかかります。

たり、イベントをたどる可能性:上記を行うには

$('div.navigation').on("click", function(event) { 
    if(event.target.href){ alert(event.target.href); } 
}); 

理由は、同様に、メモリの目的です。ラッパーだけを見ている場合は、メモリ内にイベントリスナーが1つしかありません。 'a'タグ自体にイベントリスナーがある場合は、ラッパーのすべての 'a'タグに対してイベントリスナーをメモリに保持する必要があります。これは重くなる可能性があります...イメージページに読み込まれたすべての画像にGoogleがイベントリスナーを持っていたら想像してみてください。

+0

+1は '.on'ですが、変数に対するあなたの立場は*興味があります*。 – Mathletics

+0

@Mathletics場所をメモリに設定する唯一の理由は、後で必要となることでしょう。 jQuery Objectを一度設定している場合は、なぜ「時間」MHzを使用しますか?この方法では、セレクタの値とその属性からの結果をすぐに文字列に変換し、この場合は関数呼び出し(警告)内の変数値に設定します。 – Relic

+0

時間は安いですが、 1ダースのリンクにイベントを付けたり、1つのvarを宣言したりすることに違いがあると思う.10kリンクのようにこれをやっていれば別の話かもしれない。 +1コードゴルフ – JKirchartz

関連する問題