2009-07-07 4 views
1

私はjQueryで非常に新しいです...私は何度もJavascriptを使いましたが、DOM操作に精通していますが、jQueryのAPIやギアではありません。jQueryは動的に追加されたDOMオブジェクトを見つけられませんか?

私は動的にそのようなJSON呼び出しによってDOM要素を追加してい

:TD項目を手動でページにslideDownは完璧に動作クリック機能している場合...私は動的に上記のコードを使用している場合

$(document).ready(function() { 
     var url = "jsonMenuItems.js"; 
     $.getJSON(url, null, function(data) { 
      var html = ""; 
      //alert(data.items); 
      data = data.items; 
      for (var key in data) {  
       html += "<td class=\"menuItem\"><span>" + data[key].name + "</span></td>"; 
      }; 
      $("#menuTR").html(html); 
     }); 

     var lZeroArray = $("#menu td"); 
     lZeroArray.click(function() { 
      $("#submenu").slideDown("fast"); 
     }); 
    }); 

TDアイテムを追加すると、クリック機能のslideDownは起動しません。

jQueryがそれ自身の追加項目を見つけられないか、何か間違っていますか?

答えて

4

jQuery liveをご覧ください。これにより、動的に追加された項目にイベントをバインドすることができます。

$("#menu td").live("click", function(){ 
    $("#submenu").slideDown("fast"); 
}); 
+0

+1(生きます)1.3以降で利用可能です。または、私のように1.2を使用している場合、プラグインがあります。 – Wayne

+0

ありがとうございました。これはうまくいきました。もう一つの生きている答えがあったが、あなたのものは最初に日付が付けられているので、あなたは答えられた小切手を得る。 – webwires

1

誤った要素にクリックイベントが追加されているようです。 id = "menuTR"の要素に動的に追加されたTDを追加していますが、id = "menu"の子孫であるTD要素にclickイベントを設定しています

テストするには、 #menu td ")から$("#menuTR td ")へ、またはその逆になります。あるいは、$( "td.menuItem")で要素を選択すると、menuItemのクラスを持つすべてのTD要素が選択されます。

+0

-1いいえ、webwiresはセレクタが正しく動作すると述べています。クリック機能のslideDownは完全に機能します。 – Wayne

+0

ああ、彼がクリック機能をテストしたとき、彼は手動でTDをページに置いていたので、既存の囲み要素(idは "menu"、おそらく)を変更していなかったでしょう。 – Sean

+0

私は投票を取り消します。 #menuTR append()を使用しましたが、イベントハンドラは#menu tdにバインドされています。 – Wayne

6

問題は、イベントハンドラが$('#menu td')にバインドされていますが、これが行われた時点で#menuにはtdがありません。

live()を使用すると、後でDOMに追加されるオブジェクトにjqueryがイベントハンドラを追加するようになります。

また、古いjqueryのバージョンで使用されるソリューションは、次のようになります。

var url = "jsonMenuItems.js"; 
    $.getJSON(url, null, function(data) { 
     var html = ""; 
     //alert(data.items); 
     data = data.items; 
     for (var key in data) { 
        html += "<td class=\"menuItem\"><span>" + data[key].name + "</span></td>"; 
     }; 
     $("#menuTR").html(html); 
     $("#menu td").click(function() { 
      $("#submenu").slideDown("fast"); 
     }); 
    }); 
    var lZeroArray = $("#menu td"); 
    lZeroArray.click(function() { 
     $("#submenu").slideDown("fast"); 
    }); 
+0

投稿されたコードがうまくいかない理由を実際に説明するための+1 –

+0

Grrr ... '新しい回答はあなたのものと同じです – SeanJA

0

あなたはそれらが作成された後、それらにクリック機能を再適用する必要があるためである。

$.getJSON(url, null, function(data) { 
     var html = ""; 
     //alert(data.items); 
     data = data.items; 
     for (var key in data) {  
      html += "<td class=\"menuItem\"><span>" + data[key].name + "</span></td>"; 
     }; 
     $("#menuTR").html(html); 

     $("#menu td").click(function() { 
      $("#submenu").slideDown("fast"); 
     }); 

    }); 
関連する問題