无法使用 jQuery 找到动态添加的 HTML 元素

Dynamically added HTML elements can't be found using jQuery

提问人:Charles Anderson 提问时间:3/10/2010 最后编辑:Charles Anderson 更新时间:2/22/2014 访问量:7963

问:

我正在用 HTML 实现一个树浏览器。单击节点时,我调用一个函数来添加节点的子元素。目前为止,一切都好。我现在想立即调用其中一个子元素的单击处理程序来扩展它。我的问题是jQuery找不到刚刚添加的子元素。当我在调试器中单步执行时,在浏览器呈现新元素之前,正在调用我用于查找元素的代码,我猜这就是问题所在。

是否有我可以等待的事件(可能类似于 onload)标记新添加的 HTML 何时可见?或者我可以调用一个方法来强制渲染提前发生?欢迎提出任何建议。

注意:从那以后,我意识到问题完全是我的错,而不是浏览器或jQuery的错。请在下面查看我的答案。

jQuery的 [HTML全文]

评论

0赞 Felix Kling 3/10/2010
一些代码会有所帮助,以便为您提供帮助。
0赞 deceze 3/10/2010
您能否添加一些有问题的代码来帮助提供更具体的解决方案?

答:

10赞 Nick Craver 3/10/2010 #1

为此,您可以使用 .live(),将您的点击处理程序绑定到它,而不是像这样:.click()

$(document).ready(function() {
  //instead of $(".myTreeNode").click(....
  $(".myTreeNode").live('click', function() {
    //Do stuff
  });
});

A 将事件处理程序绑定到它在执行时找到的元素,因此新元素没有处理程序。 相反,在 DOM 级别侦听点击冒泡,因此现在添加还是以后添加都无关紧要。在有很多元素的情况下,你也有事件处理程序,而不是每个元素的 1,在几个元素之后,这也变得更有效。.click().live()

评论

0赞 Charles Anderson 3/11/2010
我试过了,但它没有解决它。问题在于,新添加的 HTML 在呈现之前似乎无法被 jQuery 找到,而且这仍然是将来的事情。
0赞 Nick Craver 3/11/2010
@Charles - 除了绑定点击事件之外,您还在做些什么吗?点击应该由本地处理,或者如果你想让它更本地化。live().delegate()
1赞 Charles Anderson 3/11/2010 #2

我最终通过使用 setTimeout() 来延迟我的代码,直到渲染新元素,从而解决了这个问题。不过,这不是一个理想的解决方案,因为我选择的超时期限是相当任意的。

我已经弄清楚了。我调用的添加 HTML 的函数是通过回调异步执行的。因此,当我试图找到新的 HTML 元素时,它们真的还没有出现。我现在已经更改了我的代码,因此回调也负责处理新添加的元素,从而保证它们会存在。

2赞 mesut 2/22/2014 #3

“live”自 jquery 1.7+ 以来已被弃用,所以试试这个,

$(document).on("click","#Cancel" , function(){
 //do something
});

访问 http://api.jquery.com/on/ 了解更多信息