2011-03-22 71 views
0

我试图创建一个循环,每次通过$.post和完成后检索另一个网页的内容,做下一个页面,直到页面上的元素显示为0的结果。jQuery的帖子在一个循环中,轰然浏览器

function scrapeIt() { 
    $(".currentPage").html("Current Page: " + page); 
    $.post("scrapePosts.aspx", { page: page, search: keyword }, function (data) { 
     $(".status").html(data); 
     if ($("#count").html() == "10") { 
      scrapeIt(); 
     } else { 
      alert("Stopping..."); 
     } 
    }); 
    page++; 
} 

$(document).ready(function() { 
    var page = 1; 
    var keyword; 
    var stillGettingResults = true; 

    $("#go").click(function() { //Start Button 
     keyword = $("#keyword").val(); // Textbox 
     $(".status").html("Loading..."); 
     scrapeIt(); 
    }); 
}); 

的想法是为scrapeIt()功能再次打电话给自己,但只有当它已经完成了POST请求。它似乎只是冻结。

+0

我不明白这一点?是否应该每次覆盖'$(“。status”)?你在哪里匹配'$(“#count”)'?它是'data'里面的一些元素。 – Zlatev 2011-03-22 07:57:12

+0

是的,count是数据中div的ID。这只是一个UI的事情。看到进展。对我的问题真的不适应。为清楚起见,应该删除它。 – gunwin 2011-03-27 22:27:41

回答

3

var page = 1var keyword都应该在全局范围内声明的,否则他们在function scrapeIt()undefined

由于没有pagekeyword作为发布请求的一部分发送,因此您的页面可能会冻结,并且服务器可能无法理解请求。

+0

你的权利!谢谢! – gunwin 2011-03-22 08:08:17

0

看到setTimeout()$.post是不是异步我猜不断呼吁将冻结浏览器线程

+0

我认为,如果我只在成功部分再次调用函数,它只会在完成时触发,因此一次只能执行一次。 – gunwin 2011-03-22 07:57:01

+0

你认为这只是一个猜测需要多长时间才能完成的情况吗? – gunwin 2011-03-22 07:57:22

+0

是它被称为只有一次,但它使主线程忙,不让它做任何UI更新任务,而不是调用你的方法异步将有助于疏通主线程 – yasirmturk 2011-03-22 08:06:39

0

由于递归页面始终为零。 您需要在post回调中递增页面变量,而不是在scrapeIt结束时。

$.post("scrapePosts.aspx", { page: page, search: keyword }, function (data) { 
     page++; 
     $(".status").html(data); 
     if ($("#count").html() == "10") { 
      scrapeIt(); 
     } else { 
      alert("Stopping..."); 
     } 
+0

我会同意,最好是内增加'page'后回调,但我认为它不会影响当前的代码。 – 2011-03-22 07:56:36

+0

LOL没有这个页面将始终为零 – 2011-03-22 07:57:41

+0

我做这个它仍然冻结。尽管如此,有意义。 – gunwin 2011-03-22 07:58:49