提问人:Charles Anderson 提问时间:3/10/2010 最后编辑:Charles Anderson 更新时间:2/22/2014 访问量:7963
无法使用 jQuery 找到动态添加的 HTML 元素
Dynamically added HTML elements can't be found using jQuery
问:
我正在用 HTML 实现一个树浏览器。单击节点时,我调用一个函数来添加节点的子元素。目前为止,一切都好。我现在想立即调用其中一个子元素的单击处理程序来扩展它。我的问题是jQuery找不到刚刚添加的子元素。当我在调试器中单步执行时,在浏览器呈现新元素之前,正在调用我用于查找元素的代码,我猜这就是问题所在。
是否有我可以等待的事件(可能类似于 onload)标记新添加的 HTML 何时可见?或者我可以调用一个方法来强制渲染提前发生?欢迎提出任何建议。
注意:从那以后,我意识到问题完全是我的错,而不是浏览器或jQuery的错。请在下面查看我的答案。
答:
为此,您可以使用 .live(),
将您的点击处理程序绑定到它,而不是像这样:.click()
$(document).ready(function() {
//instead of $(".myTreeNode").click(....
$(".myTreeNode").live('click', function() {
//Do stuff
});
});
A 将事件处理程序绑定到它在执行时找到的元素,因此新元素没有处理程序。 相反,在 DOM 级别侦听点击冒泡,因此现在添加还是以后添加都无关紧要。在有很多元素的情况下,你也有事件处理程序,而不是每个元素的 1,在几个元素之后,这也变得更有效。.click()
.live()
评论
live()
.delegate()
我最终通过使用 setTimeout() 来延迟我的代码,直到渲染新元素,从而解决了这个问题。不过,这不是一个理想的解决方案,因为我选择的超时期限是相当任意的。
我已经弄清楚了。我调用的添加 HTML 的函数是通过回调异步执行的。因此,当我试图找到新的 HTML 元素时,它们真的还没有出现。我现在已经更改了我的代码,因此回调也负责处理新添加的元素,从而保证它们会存在。
“live”自 jquery 1.7+ 以来已被弃用,所以试试这个,
$(document).on("click","#Cancel" , function(){
//do something
});
访问 http://api.jquery.com/on/ 了解更多信息
评论