Reputation: 7123
I've seen a number of posts (append supposedly immediate) with conflicting accepted answers on this. We're using JQuery 1.4 (http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js) and append() seems to be asynchronous, such that:
Edited to show code in context of AJAX callback
...
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");
}
Executes and creates the page as expected, yet the targets query yields nothing at runtime. Running the same code in the JS console retrieves the elements as expected.
If this is the expected behavior in JQuery what's the proper way to wait until append is finished?
Upvotes: 27
Views: 21198
Reputation: 1644
Try this, if things don't work after an append
.
$('#dynamic-container').append(<your-content>) ;
setTimeout(function() {
...code which addresses elements inside #dynamic-container...
},0) ;
More Details:
append
is synchronousdiv
after an append
Upvotes: 13
Reputation: 7123
All of the comments helped track this down. I was following a red herring in the console. The problem wasn't with synchronicity, it was with the next lines:
$targets.each( function(){
...
this.html();
...
Needed to be
$(this).html();
In short, everyone was correct. Jquery append() behaves synchronously.
Upvotes: 29