1

このようなjQueryの.on()関数を使用している場合(他にもありますが、これが抽出された主な問題領域です):

$(document).on("click", 
          $("#contcont a, #leftnav li a, #leftnav li ul a, #mainarea-home a").not(".secitem-mid a"),
    function clicker(event, sData) {

    var $this = $(this);

    sHREF = $this.attr("href");

    alert(sHREF);

} );

未定義になっているので、クリックされている要素を実際に取得する最良の方法は何ですか? .on()新しいデータが読み込まれるたびにすべての要素にアタッチするのではなく、常に発生するようにする必要があります (これは Yahoo! ストアを介して行われるため、この方法で行う必要があります)。ありがとう。

4

2 に答える 2

7

の 2 番目の引数onセレクターであり、jQuery オブジェクトではありません。イベント委任に使用されます。

それらを直接接続するつもりなら、次のようにします。

$("#contcont a, #leftnav li a, #leftnav li ul a, #mainarea-home a").not(".secitem-mid a").on("click", function clicker(event, sData) {

    var $this = $(this);

    sHREF = $this.attr("href");

    alert(sHREF);

});

本当にイベント委任を使用したい場合、.not(マークアップによっては) メイン シリーズの各セレクターでそれを繰り返さなければならない可能性があるため、この部分は少し扱いに​​くいものになります。それは醜いので、後でハンドラー関数でその特定のケースを処理する方が良いかもしれません:

$(document).on("click", "#contcont a, #leftnav li a, #leftnav li ul a, #mainarea-home a", function clicker(event, sData) {

    var $this = $(this);

    // Handle the "not" part
    if (!$this.is(".secitem-mid a")) {
        sHREF = $this.attr("href");

        alert(sHREF);
    }
});

ただし、個別に: 通常は、処理する要素に最も近いコンテナーで委任をルート化することをお勧めします。、、および要素が動的でない#contcont場合は、たとえば、次のようにではなく、それらの委任をルート化することを検討します。#leftnav#mainarea-homedocument

$("#contcont"     ).on("click", "a:not(.secitem-mid a)", clicker);
$("#leftnav"      ).on("click", "li a:not(.secitem-mid a)", clicker);
$("#mainarea-home").on("click", "a:not(.secitem-mid a)", clicker);
function clicker(event, sData) { ... }

必要なのは 4 つではなく 3 つだけだったことに注意してください。あなたの#leftnav li ul aセレクターはすでに でカバーされてい#leftnav li aます。


そして、少し話題から外れています:名前付き関数式を使用していることに注意してください。これは、IE8 以前では扱いにくい場合があります。上記の最後の例では、それを廃止し、代わりに関数宣言にしています。

于 2012-07-09T15:17:04.243 に答える
0

ON メソッドは委任なしでも使用できます。ページが読み込まれた後にコンテンツが追加されない場合は、次のコードを使用して要素を選択できます。

var elements = $('#contcont a, #leftnav li a, #leftnav li ul a, #mainarea-home a').not('.secitem-mid a');

そして、少しのイベント処理を行うには、次のようにします。

$(elements).on('click', function() {
    //do something
});
于 2012-07-09T15:29:39.307 に答える