Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
33
rated 0 times [  40] [ 7]  / answers: 1 / hits: 54611  / 14 Years ago, mon, january 17, 2011, 12:00:00

I seem to be having some issues with making HEAD requests, and preserving the integrity of data in an array.



Given this snippet:



var imageTemp = Array();

$('*')
.each(function(index){
if($(this).css('background-image') != 'none'){
imageTemp.push($(this).css('background-image').slice(5, -2));
}
});


I capture the URLs of all background-images on a given page. Now, trying to grab the size of each image via HEAD requests for Content-Length, I use this snippet:



var imageData = Array();

for(var i = 0; i < imageTemp.length; i++){
ajaxSizeRequest = $.ajax({
type: HEAD,
async: true,
url: imageTemp[i],
success: function(message){
imageData.push([imageTemp[i], ajaxSizeRequest.getResponseHeader('Content-Length')]);
}
});
}


However, when I dump imageData via console.log, I each element (which should be an array containing the URL and the content-length) ends up as [undefined, XXXX] where XXXX is always the size of the last requested Content-Length



I'm stumped, though it appears to be a timing/scoping issue. Do I have a sort of race-condition occuring here?


More From » jquery

 Answers
13

The problem is that the single variables i and ajaxSizeRequest being captured by the callback function are the same variables for all instances of the callback function. I think if you call a function and pass the index variable to it and, at the same time, scope the request variable locally to the function itself use the response parameter of the done handler, you should end up with independent variables captured by the callback. It should then reference each array element and each response variable correctly.



var imageData = Array();

for(var i = 0; i < imageTemp.length; i++){
updateImageData( i );
}

function updateImageData( i )
$.ajax({
type: HEAD,
async: true,
url: imageTemp[i],
}).done(function(message,text,jqXHR){
imageData.push([imageTemp[i], jqXHR.getResponseHeader('Content-Length')]);
});
}

[#94189] Friday, January 14, 2011, 14 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
hadens

Total Points: 142
Total Questions: 98
Total Answers: 100

Location: Kenya
Member since Mon, Jun 14, 2021
3 Years ago
hadens questions
;