【问题标题】:Loading images sequentially using Jquery in Google App Engine在 Google App Engine 中使用 Jquery 顺序加载图像
【发布时间】:2012-03-04 15:41:41
【问题描述】:

解决方案: 我使用 setTimeout(ajaxcall,timeoutmillis) 而不是立即进行所有 ajax 调用。 图像已完美更新。没问题。 永远不要在没有给浏览器一些喘息时间的情况下循环发送多个 ajax 请求。 :)

我正在使用 javascript 将多张图片上传到 Google App Engine。我正在发送图像 一一发送到服务器,并一一接收服务器的响应。响应 包含加载图像的缩略图链接。我希望能够一一显示这些缩略图。问题是,例如,如果我有 100 张图像,则在从服务器收到第 100 个响应之前不会显示图像。直到那时页面的行为就好像它正在加载某些东西但图像不可见。不过,在 Ajax 调用完成后,所有图像都会显示出来。

更新:我发现不是那么优雅的解决方法。如果您使用创建图像占位符 一些虚拟图像并稍后在ajax加载期间更改img src,它可以工作。不是很优雅的解决方案,但如果您添加 1 像素的不可见图像,效果将或多或少相同。

这是代码。

this.handlephotoupload = function(input) {
    var uploadedfiles = input.files;
    var toolarge = "";
    var maxsize = 10240000;
    var counter = 1;
    var downloadcounter = 0;
    var rownumber = 0;
    var images=new Array();
    var arraycount=0;
    var totalimagecount=0;
    $("#phototable").append("<tr><td><div id=loading>Loading images please wait......</div></td></tr>");
    for(var i = 0; i < uploadedfiles.length; i++) {
        if(uploadedfiles[i].size > maxsize) {
            toolarge += uploadedfiles[i].name + "\n";
            totalimagecount+=1;
        } else {
            var filedata = new FormData();
            filedata.append("uploadimage", uploadedfiles[i]);
            $("#loading").show();
            $.ajax({
                url : 'photodownloader',
                data : filedata,
                cache : false,
                contentType : false,
                processData : false,
                type : 'POST',
                success : function(receiveddata) {
                    var imagedata = JSON.parse(receiveddata);
                    var data = imagedata['imageinfo'];
                    var imagelink = data['imagelink'];
                    var thumbnaillink = data['thumbnailLink'];
                    var imageID = data['uniqueID'];
                    var imagename = data['imagename'];
                    if(downloadcounter % 3 == 0) {
                        rownumber += 1;
                        var row = $('<tr id=thumbnailsrow' + rownumber + '></tr>');
                        $("#phototable").append(row);
                    } else {
                        var row = $("#thumbnailsrow" + rownumber);
                    }
                    //images[arraycount++]'<td><a href=' + imagelink + '><img src=' + thumbnaillink + '/></a></td>')
                    var curid="imgload"+downloadcounter;
                    //$("#loadimg").append("<div id="+curid+"></div>");
                    //$("#loadimg").append("<img src="+thumbnaillink+"></img>");
                    //$("#"+curid).hide();
                    //$("#"+curid).load(thumbnaillink);
                    $(row).append('<td align=center><a href=' + imagelink + '><img src=' + thumbnaillink + '/></a></td>');
                    //$("#"+curid).remove();
                    downloadcounter+=1;
                    totalimagecount+=1;
                    if(totalimagecount==uploadedfiles.length){
                        $("#loading").hide();
                    }
                }
            });
        }
    }
    if(toolarge != "") {
        alert("These images were not uploaded due to size limit of 1MB\n" + toolarge);
    }
}

【问题讨论】:

  • 如果您的加载 img 设置为显示在图像上,它将在每个请求中显示,因此看起来它永远不会被隐藏
  • 我想让这一行添加的图片显示,$(row).append('')
  • 不要在您的问题中发布解决方案,将其添加为回复并将其标记为已接受。

标签: javascript jquery google-app-engine


【解决方案1】:

如果您想要单独的响应,则必须提出单独的请求。

但不要一次异步触发 100 个请求,只需触发 X 并保持一个计数器,您可以使用计时器检查该计数器。每次收到响应时,您都会减少该计数器,并且每次计时器击中时,您都可以简单地触发 X - counter 请求。这样你一次只有 X 个并发请求...

【讨论】:

  • 我正在提出单独的请求并获得单独的响应。问题是我无法使用通常的方式在 HTML 中反映响应。感谢您提供有关不要让异步请求使服务器超载的提示。
  • The problem is I cant reflect the response in the HTML using the usual way 到底是什么意思?
  • 我的意思是,假设我发送请求 1,并接收响应 1,缩略图链接是响应 1,我正在使用 $(row).append( '') 这应该会立即在 html 页面中显示缩略图,但确实如此不是。只有在收到所有回复后,它才会显示出来。我在我的更新中写道,如果在发出请求之前添加图像占位符,这将非常有效。
  • @specialscope: 有趣的是,当您收到回复后,您能否在“网络(工作)”选项卡中与 FireBug 或其他一些检查员一起检查?也就是说,对于单个请求/响应,您会看到水平条有多长。可能是它实际上以某种方式延迟了对浏览器的任何响应,直到所有文件都上传完毕。考虑一下,可能是请求优先于响应......
  • Tom,谢谢,我去看看,然后告诉你结果。
猜你喜欢
  • 1970-01-01
  • 2012-06-13
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
相关资源
最近更新 更多