2011-02-22 74 views
17

我看过一些帖子(append supposedly immediate),其中有一些矛盾的接受答案。我们使用JQuery 1.4http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js)和append()似乎是异步的,这样的:Jquery append()是否异步行为?

编辑以显示

... 
var message = $.ajax({ 
    type: "GET", 
    url: "/getVolumes/" + _Id, 
    async: false 
}).responseText; 
if (parseInt(message) != 0){ 
    var $results = $(message); 
    $MAIN_DIV.append($results); 
    retrieveTargets(); 
} 
...  
function retrieveTargets(){ 
    var $targets = $(".resultTargets"); 
} 

执行AJAX回调的背景下代码,并创建如预期的页面,但目标查询在运行时不会产生任何结果。在JS控制台中运行相同的代码将按预期方式检索元素。

如果这是JQuery的预期行为,那么等待append完成的正确方法是什么?

+2

jQuery 1.8 ??怎么来的??你来自未来? :) – DrStrangeLove 2011-02-22 23:21:29

+2

追加是同步的,但您的Ajax调用不是。此代码位于何处?在你的ajax调用的回调函数中? – Capsule 2011-02-22 23:23:45

+0

使用正确的版本进行编辑。我敢打赌,这将在1.8中以我想要的方式工作。 – RSG 2011-02-22 23:25:41

回答

24

所有的评论帮助追踪了这一点。我在控制台中跟着一只红鲱鱼。 问题是不同步,这是下一个行:

$targets.each(function(){ 
    ... 
    this.html(); 
    ... 

需要进行

$(this).html(); 

总之,大家是正确的。 Jquery append()的行为是同步的。

8

试试这个,如果事情不能在append之后工作。

$('#dynamic-container').append(<your-content>) ; 
setTimeout(function() { 
    ...code which addresses elements inside #dynamic-container... 
},0) ; 

更多详细信息:

  • 显然append是同步
  • 显然DOM不会同步更新,特别是在谷歌Chrome,我面对尝试检索div的高度时,这个问题后append
  • 我的假设是有浏览器更新线程异步更新,更多的评论下面,仍然不清楚如何w的东西ork,但该解决方案适用于所有情况。
+1

)之前放置'console.log($ MAIN_DIV.length)',会发生什么?这是不正确的。浏览器将更新它的布局,即使它不可见地呈现给用户,当JavaScript从DOM请求数据或测量时(这是[layout thrashing](http://wilsonpage.co.uk/preventing-layout-thrashing/)的原因)。 – 2014-12-08 20:43:44

+0

好吧,渲染线程部分是我对浏览器如何处理UI更新的假设,我在我的代码中遇到了这个问题,并使用上面的解决方案修复了它,甚至可能是布局代码在同一线程中的函数完成后运行。关于浏览器如何工作的专家 – Bitonator 2014-12-12 15:18:40

+1

我讨厌这么说,但我认为你错了。我怀疑你能够对上述问题进行简单的再现(某些问题),隔离问题; '.append'确实是完全同步的。另请注意,JavaScript是单线程的,并且事物(包括浏览器)不会同时变更数据。 – 2014-12-12 19:03:46