2009-07-07 66 views
1

我在jQuery上很新颖......我已经多次使用Javascript,并且对DOM操作非常熟悉,但不是API或jQuery的齿轮。jQuery没有找到动态添加的DOM对象?

我动态通过JSON通话将DOM元素,像这样:

$(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完美的作品......如果我用上面的代码,以动态添加TD项目,然后点击功能slideDown不会触发。

jQuery无法找到它自己添加的项目,或者我做错了什么?

回答

4

看看jQuery live。这将让您将事件绑定到动态添加的项目。

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

+1生活( )从1.3开始提供。或者如果像我一样使用1.2,就有一个插件。 – Wayne 2009-07-07 03:15:06

+0

非常感谢你...这工作。还有另一个现场答案,但你的日期是第一次,所以你会得到答复检查。 – webwires 2009-07-07 13:33:45

1

它看起来就像是增加点击事件到错误的元素。您将动态添加的TD添加到id =“menuTR”的元素,但是您将设置点击事件作为id为“menu”的后代的TD元素

要测试,请尝试更改$(“ #menu td“)到$(”#menuTR td“),反之亦然。或者,您可以尝试使用$(“td.menuItem”)选择元素,它使用一个menuItem类来选择所有TD元素。

+0

-1不,webwires声明选择器正常工作 - 点击功能slideDown完美工作。 – Wayne 2009-07-07 03:14:24

6

问题是:您的事件处理函数绑定到$('#menu td'),但是在完成时,#menu中没有td

使用live()可以确保的jQuery添加事件处理程序稍后添加到DOM对象。

或者,在旧的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

那是因为你必须重新点击功能,它们在创建之后:

$.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"); 
     }); 

    });