2011-02-05 106 views
0

在下面的代码Ajax响应和匿名函数范围

var entryTemplate = document.getElementById('entryTemplate'); 
entryTemplate = entryTemplate.firstChild; 

for (var ipost in posts) 
{ 
    var post = posts[ipost]; 
    var clone = entryTemplate.cloneNode(true); 
    clone = $(clone); 

    if (post.imageURL) 
    { 
    var imgElement = document.createElement('img'); 
    var largeImageURL = post.largeImageURL ? post.largeImageURL : post.imageURL; 
    imgElement.src = post.thumbPresent ? POST_THUMB_URL + '/' + post.postID : largeImageURL; 
    imgElement.alt = ''; 
    clone.find('div.BlogImageURL a').attr('href', largeImageURL).text(largeImageURL); 
    clone.find('div.BlogImage a').attr('href', imgElement.src).append(imgElement); 

    // get bytesize 
    var postdata = 'inline_image_url=' + encodeURIComponent(post.imageURL); 
    postdata += '&linked_image_url=' + encodeURIComponent(post.largeImageURL); 
    $.ajax({ 
    type: 'POST', 
    url: ASYNC_GET_BYTESIZE_URL, 
    data: postdata, 
    success: function(bytesize) { 
     clone.find('.BlogImageBytesize').html(bytesize); 
    } 
    }); 
    } 
    else 
    { 
    clone.find('div.BlogImageURL').text('(This post contains no images)'); 
    clone.find('div.BlogImage').remove(); 
    } 

    $('#outputDiv').append(clone); 
} 

clone.find('.BlogImageBytesize').html(bytesize); 

所有Ajax响应(粗线)修改最后克隆,大概在第一响应到达,因为循环结束后和克隆点到最后的克隆

我该如何解决这个问题?

谢谢。

回答

2

也许你可以设置clone作为你的ajax调用的context。 (见docs here)。然后,我觉得这工作是这样的:

$.ajax({ 
    type: 'POST', 
    url: ASYNC_GET_BYTESIZE_URL, 
    data: postdata, 
    context: clone, 
    success: function(bytesize) { 
     $(this).find('.BlogImageBytesize').html(bytesize); 
    } 
}); 

我不知道是否该context必须是一个普通的DOM元素,或者它可以是一个jQuery对象,但希望这能让你走上正轨。

+0

谢谢,我不知道关于上下文选项... – Robin 2011-02-06 00:19:08