2013-03-15 42 views
0

所以我有一個循環,顯示從一個文本文件到一個頁面的HTML表,並且它這樣做,直到它已經使用了所有可用的匹配行的txt文件從我已經在代碼的另一部分中預先確定的數組中。JavaScript需要關於如何'暫停'一個while循環的想法

唯一的問題是,當循環正在進行,並且所有表正在加載時,頁面就會坐在那裏,看起來空白。加載可能需要很長時間,特別是在緩慢的互聯網上。我需要一次加載大約10個表格,然後在頁面底部有一個按鈕「點擊此處顯示更多結果」,導致加載10個表格,直到所有可用表格都是用過的。

我該怎麼辦?我試過把循環放入循環中,並使用一堆複雜的if語句,但都無濟於事。

這裏是循環:

arrayFinal[arrayln2]="end"; 
    var displayNumber=0; 
    while(arrayFinal[displayNumber].charAt(0) != "e"){ 
    var boxPath="camper_htmls/"+arrayFinal[displayNumber]+".txt"; 
    boxhttp = new XMLHttpRequest(); 
    boxhttp.open("GET",boxPath,false); 
    boxhttp.send(null); 
    var boxHTML = boxhttp.responseText; 
    var setDivId=document.createAttribute("id"); 
    setDivId.value=("div_"+displayNumber); 
    var node = document.createElement("div"); 
    node.setAttributeNode(setDivId); 
    document.getElementById("resultContainer").appendChild(node); 
    var divIdNumber = ("div_"+displayNumber); 
    document.getElementById(divIdNumber).innerHTML=boxHTML; 
    displayNumber++; 
    } 
+0

你必須異步處理您的數據。看看'setTimeout':https://developer.mozilla.org/en-US/docs/DOM/window.setTimeout或者簡單地做一個異步請求。 – 2013-03-15 19:10:52

+1

是否有任何理由讓你的AJAX設置爲同步?這真的是違背技術,這可能是什麼原因造成你的問題 – 2013-03-15 19:12:05

+0

@BenjaminGruenbaum因爲當它設置爲真,它不起作用,我不知道如何解決它。說實話,我不知道實際上有什麼不同。我對這一切都很陌生,所以我仍然有很多東西需要學習。 – nife552 2013-03-15 19:38:01

回答

0
The `setTimeout()` 

    var i = 1;      // set your counter to 1 

    function myLoop() {   // create a loop function 
     setTimeout(function() { // call a 3s setTimeout when the loop is called 
      alert('hello');   // your code here 
var boxPath="camper_htmls/"+arrayFinal[displayNumber]+".txt"; 
boxhttp = new XMLHttpRequest(); 
boxhttp.open("GET",boxPath,false); 
boxhttp.send(null); 
var boxHTML = boxhttp.responseText; 
var setDivId=document.createAttribute("id"); 
setDivId.value=("div_"+displayNumber); 
var node = document.createElement("div"); 
node.setAttributeNode(setDivId); 
document.getElementById("resultContainer").appendChild(node); 
var divIdNumber = ("div_"+displayNumber); 
document.getElementById(divIdNumber).innerHTML=boxHTML; 
displayNumber++; 
    enter code here 
      i++;      // increment the counter 
      if (i < 10) {   // if the counter < 10, call the loop function 
      myLoop();    // .. again which will trigger another 
      }      // .. setTimeout() 
     }, 3000) 
    } 

    myLoop(); 
+1

這是怎麼樣的OP想要什麼? – 2013-03-15 19:11:08

+0

它在加載時滯後的原因是因爲他將異步設置爲false。 – Zachrip 2013-03-15 19:11:11

+0

但在這裏,您將它用作實際的暫停。如何在用戶點擊按鈕時將其設置爲繼續? – nife552 2013-03-15 19:18:22

0

編輯:我想給你一個很好的jsfiddle展示如何正確使用異步請求。

這裏試試這個(它現在是異步的,這樣,它不會做你描述):

arrayFinal[arrayln2]="end"; 
var displayNumber=0; 
while(arrayFinal[displayNumber].charAt(0) != "e"){ 
var boxPath="camper_htmls/"+arrayFinal[displayNumber]+".txt"; 
boxhttp = new XMLHttpRequest(); 
boxhttp.open("GET",boxPath,true); 
boxhttp.send(null); 
var boxHTML = boxhttp.responseText; 
var setDivId=document.createAttribute("id"); 
setDivId.value=("div_"+displayNumber); 
var node = document.createElement("div"); 
node.setAttributeNode(setDivId); 
document.getElementById("resultContainer").appendChild(node); 
var divIdNumber = ("div_"+displayNumber); 
document.getElementById(divIdNumber).innerHTML=boxHTML; 
displayNumber++; 
} 
+0

但會有其他問題。 – Musa 2013-03-15 19:13:19

+0

@Musa我不明白你的意思? – Zachrip 2013-03-15 19:14:27

+0

如果將異步設置爲true,則整個代碼不起作用 – nife552 2013-03-15 19:23:18

0

爲什麼不加一個計數器來while循環?即

function runTenTimes(){ 
    var i=0; 
    while((there_is_text)&&(i<10){ 
     do stuff; 
     i++; 
    } 
} 
+0

它在加載時滯後的原因是因爲他將異步設置爲false。 – Zachrip 2013-03-15 19:10:50

+0

當我嘗試取消暫停它時,問題就出現了。我可以使用多個與我相比具有不同數字的while循環,但是在僅顯示2-3個表格的頁面上,它會混亂起來 – nife552 2013-03-15 19:25:35

+0

如果有一個'(there_is_text)'變量,一旦沒有其他表格,在創建10個表之後或者在所有數據都在表中之後,您的while循環將退出。你不需要爲'i'設置不同的數字,每當你需要更多的表時,就運行整個'runTenTimes'函數,'i'將初始化爲0,然後循環到10。 – ckersch 2013-03-18 13:38:03

0

我不會用循環,而是使用XMLHttpRequest的回調請求下一個項目時,一個結束

arrayFinal[arrayln2]="end"; 
var displayNumber=0; 
function callback(){ 
    if((arrayFinal[displayNumber].charAt(0) != "e"){ 
     var boxPath="camper_htmls/"+arrayFinal[displayNumber]+".txt"; 
     boxhttp = new XMLHttpRequest(); 
     boxhttp.open("GET",boxPath,true); 
     boxhttp.onreadystatechange(function(){ 
      var boxHTML = boxhttp.responseText; 
      var setDivId=document.createAttribute("id"); 
      setDivId.value=("div_"+displayNumber); 
      var node = document.createElement("div"); 
      node.setAttributeNode(setDivId); 
      document.getElementById("resultContainer").appendChild(node); 
      var divIdNumber = ("div_"+displayNumber); 
      document.getElementById(divIdNumber).innerHTML=boxHTML; 
      callback(); 
     }); 
     displayNumber++; 
     boxhttp.send(null);    
    } 
} 
callback();