2010-03-10 80 views
5

我正在HTML中实现树型浏览器。在点击一个节点时,我调用一个添加节点的子元素的函数。到现在为止还挺好。我现在想要立即调用其中一个子元素的click处理程序来扩展它。我的问题是,jQuery找不到刚刚添加的子元素。当我在调试器中单步执行时,在浏览器呈现新元素之前,我的代码将被调用,我猜测这是问题所在。使用jQuery无法找到动态添加的HTML元素

是否有一些事件我可以等待(类似于onload也许),标记何时可以看到新添加的HTML?或者我可以调用的方法来强制渲染更早发生?欢迎大家提出意见。

注:我后来意识到问题完全是我的错,而不是浏览器或jQuery的问题。请参阅下面的答案。

+0

一些代码将是有益的,以帮助你。 – 2010-03-10 10:48:53

+0

您可以添加一些有问题的代码来帮助提供更具体的解决方案吗? – deceze 2010-03-10 10:49:19

回答

1

我最终通过使用setTimeout()来延迟我的代码,直到呈现新元素为止。尽管如此,这并不是一个理想的解决方案,因为我选择的超时时间相当随意。

我已经到底了。我调用的函数添加了HTML,通过回调异步执行。所以当我试图找到新的HTML元素时,他们确实还没有。我现在改变了我的代码,所以回调也负责处理新添加的元素,所以保证它们会出现。

10

您可以使用.live() for this,钻机你的点击处理函数,而不是仅仅.click()这样的:

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

一个.click()结合事件处理程序时,它的执行发现的元素,所以新的元素穿上”没有处理程序。 .live()而是监听DOM级别的点击以使其起泡,因此无论它们现在还是之后添加都无关紧要。在很多元素的情况下,对于每个元素,您还有事件处理程序,而不是1个,在几个元素之后,这也变得更加高效。

+0

我试过了,但没有解决。问题在于新添加的HTML似乎无法在jQuery查找之前访问,直到它被呈现,并且这仍然是未来。 – 2010-03-10 16:58:02

+0

@Charles - 除了绑定点击事件之外,你还在做些什么吗?如果你想让它更加本地化,​​点击应该由'live()'或'.delegate()'处理。 – 2010-03-10 17:20:08

2

“活”被废弃了,因为jQuery的1.7+这样试试这个,

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

访问http://api.jquery.com/on/以获取更多信息