2014-10-03 68 views
0

因此,我想获取约6000个配置文件的信息,每个配置文件都有自己的链接,其编号从1-6000开始。我想从一个页面中获取每个配置文件的特定图像。这里是代码,以获得用户1的个人资料...它说u1它需要用每个不同的数字代替1。为内容添加不同的号码

<span id="boutiqueimage"></span> 
<script>$('#boutiqueimage').load('/u1 #field_id14 dd') 
             </script> 
+0

好了,你可以得到* *通过调用'.load()'在一个循环中的图像。但是使用当前的设置会导致每个响应覆盖目标元素中的前一个响应。你想用6000张图片做什么?将它们全部添加到该元素?他们的命令是否重要? – David 2014-10-03 19:58:16

+0

@大卫有些人可能甚至没有图像和其他人会,我基本上想要让他们,让我可以显示他们所有人,并通过不同的用户图像看,让别人也看到它。你能否告诉我一个更好的方法让他们像你说的一样循环? – 2014-10-03 20:33:17

+0

@mplungjan某些配置文件ID对帮助描述不是很明确吗? – 2014-10-03 20:37:00

回答

0

乍一看这似乎是一个简单的循环会做的伎俩,但问题不一定图像但他们做什么,当你得到他们。为此,您不想使用​​,因为它只是在您的用例之外。 (它假定你要设置的获取内容的元素,但你要追加所获取的内容的元素。)

为了做到这一点,我们需要执行几乎相同的功能​​,让我们见how it does its thing。看起来它只是.ajax()标准调用这个作为它的成功处理程序:

self.html(selector ? 
      jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) : 
      responseText); 

似乎很简单。我们可以多一点简化它,因为我们知道我们有一个selector值:

$('#boutiqueimage').append(jQuery('<div>').append(jQuery.parseHTML(responseText)).find(selector)); 

我们:

self.html(jQuery('<div>').append(jQuery.parseHTML(responseText)).find(selector)); 

现在不是在self调用.html(),我们我们的目标元素调用append()需要明确定义selector

$('#boutiqueimage').append(jQuery('<div>').append(jQuery.parseHTML(responseText)).find('#field_id14 dd')); 

现在我们可以换,在AJAX调用:

jQuery.ajax({ 
    url: '/u1', 
    type: 'GET', 
    dataType: 'html' 
}).done(function(responseText) { 
    $('#boutiqueimage').append(jQuery('<div>').append(jQuery.parseHTML(responseText)).find('#field_id14 dd')); 
}); 

这应该为我们的需要复制​​的功能。 现在我们可以把它在一个循环:

for (var i = 1; i <= 6000; i++) { 
    jQuery.ajax({ 
     url: '/u' + i, 
     type: 'GET', 
     dataType: 'html' 
    }).done(function(responseText) { 
     $('#boutiqueimage').append(jQuery('<div>').append(jQuery.parseHTML(responseText)).find('#field_id14 dd')); 
    }); 
} 

应该使6000个AJAX请求每个的urli从循环不同的值。请记住,有没有保证响应将按照它们的请求顺序进行。所以这是非常不太可能产生的图像将被排序从1-6000。

编辑:在回应评论时,或许以串行而不是并行运行请求会有所帮助。让我们将操作封装到一个函数中,并从它自己的成功处理函数中调用它。也许是这样的:

function fetchImage(id) { 
    jQuery.ajax({ 
     url: '/u' + id, 
     type: 'GET', 
     dataType: 'html' 
    }).done(function(responseText) { 
     $('#boutiqueimage').append(jQuery('<div>').append(jQuery.parseHTML(responseText)).find('#field_id14 dd')); 
     if (id < 6000) { 
      fetchImage(id + 1); 
     } 
    }); 
} 
fetchImage(1); 

这会加载他们慢很多,因为它一次只有一个。但我猜6000首同时请求并不是一个好主意:)这也会顺序加载它们,这是一个奖励。

+0

好吧,它似乎是做什么,当我打开控制台我收到这个错误信息很多无法加载资源:服务器响应与状态503(服务暂时不可用)和一些未捕获的TypeError:undefined不是一个函数我知道有些人可能没有图像,但想显示这两个代码的帮助? – 2014-10-03 23:36:15

+0

这是非常糟糕的建议在循环中获取6000图像。取而代之的是在成功收到每张图片时执行下一次获取。 – mplungjan 2014-10-04 06:16:05

+0

@LeandraKatelyn:我已经用修改过的方法更新了答案,可能值得一试。 – David 2014-10-04 13:28:16

0

假设您发布的代码适用于配置文件1,并且配置文件的编号从1到6000,并且您不需要分页,那么试试这个。注意:访问片段会导致下载整个页面! 更好的解决方案是设置一个仅返回必要的html的服务器进程。

var max = 6000,cnt=1; 
function loadNext() { 
    $("#container").append('<span id="boutiqueimage'+cnt+'"></span>'); // add a span 
    $('#boutiqueimage'+cnt).load('/u'+cnt+' #field_id14 dd', 
    function (responseText, textStatus, req) { // if error 
     if (textStatus == "error") { 
     $('#boutiqueimage'+cnt).html("image "+cnt+" not found"); 
     } 
     else { 
     if (cnt<max) { 
      cnt++; 
      loadNext(); 
     } 
     } 
    }); 
} 

$(function() { 
    loadNext(); //start 
}); 

使用

<div id="container"></div>