2012-06-19 81 views
0

我正在寫一些jquery,將抓住一個XML文件的數組。然後,它將循環瀏覽並通過它們進行解析,以在頁面上顯示它們。我有這個工作,但有一件事情,如果在列出內容之前我想要做,我希望它打印文件的名稱。這是我的代碼。jQuery的 - 變量字符串打印爲一個字

$.get('inc/getMenuFiles.php', function(data) { 
    var catSplit = data.split(","); 
    var menuitems = $('.menuitems'); 
    menuitems.empty(); 

    for (i=2; i<catSplit.length; i++) { 

     url = "inc/menulists/" +catSplit[i].replace(/"/g, '').replace(/]/g, ''); 
     catName = catSplit[i].replace(/"/g, '').replace(/.xml/g, '').replace(/]/g, ''); 

     menuitems.append(catName); 

     $.ajax({ 
      type: "GET", 
      url: url, 
      dataType: "xml", 
      success: function(xml) { 
       $(xml).find('item').each(function(){ 
        var name = $(this).find('name').text(); 
        var price = $(this).find('price').text(); 
        menuitems.append(name + " - $" +price + "<br />"); 
       }); 
      } 
     }); 
    } 
}); 

這是無效的,但如果我這樣做,它的工作原理

$.ajax({ 
       type: "GET", 
       url: url, 
       async: true, 
       dataType: "xml", 
       success: function(xml) { 
        $(xml).find('item').each(function(){ 
         var name = $(this).find('name').text(); 
         var price = $(this).find('price').text(); 
         menuitems.append(name + " - $" +price + "<br />"); 
        }); 
       } 
      }).delay(); 

所以我想我只需要適當加延遲,即Ajax調用

+0

你提到的文件名稱:它與'catName'有多大的區別? – raina77ow

+0

您的問題是關於打印可變字符串,但您的要求是關於打印文件名。請澄清你的問題。 – arttronics

+0

基本上menuitems.append(catName);正在工作,但它將所有文件名打印爲一個字符串。這裏是我正在談論的屏幕截圖:http://twitpic.com/9y6xwz – jrock2004

回答

1

這是因爲您的Ajax回調將在當前執行路徑完成之前不會執行。爲了解決這個問題,你可以等到你的ajax回調函數附加catName。這應該工作:

$.get('inc/getMenuFiles.php', function(data) { 
    var catSplit = data.split(","); 
    var menuitems = $('.menuitems'); 
    menuitems.empty(); 

    for (i=2; i<catSplit.length; i++) { 

     url = "inc/menulists/" +catSplit[i].replace(/"/g, '').replace(/]/g, ''); 
     catName = catSplit[i].replace(/"/g, '').replace(/.xml/g, '').replace(/]/g, ''); 

     $.ajax({ 
      type: "GET", 
      url: url, 
      dataType: "xml", 
      success: (function(catName){ 
       return function(xml) { 
        menuitems.append(catName); 

        $(xml).find('item').each(function(){ 
         var name = $(this).find('name').text(); 
         var price = $(this).find('price').text(); 
         menuitems.append(name + " - $" +price + "<br />"); 
        }); 
       } 
      })(catName) 
     }); 
    } 
}); 

你還是(就像在你原來的代碼)有你的請求可以完成的順序沒有保證,所以有時appetizers.xmlbeer.xml會以相反的順序加載。

+0

+1爲優雅的封閉使用 –

0

發生這種情況,因爲你的後for-loop比AJAX調用更快。請記住,第一個AAJAX站起來異步。圖片這...

你正處於你的for循環的開始。你拿第一個catName,並將其追加到menuitems。然後,您啓動一​​個AJAX調用,以獲取catName中的每個itemnameprice。同時,AJAX請求尚未響應,因此我們將其中一個移至第二個catName,引發另一個AJAX請求。第一個沒有完成,我們剛剛解僱了第二個請求;所以現在我們有2個AJAX響應正在等待。與此同時,我們繼續進行第三次catName

等等,等等...

解決方案

  1. 設置在你內心的AJAX調用falseasync財產。這將使for-loop暫停,直到請求完成。
  2. ** PREFERRED **在for循環之前進行AJAX調用,將響應存儲在某個地方(可能是數組),而不是使用此數組運行for循環。
+0

我認爲async默認設置爲true?反正我加了它,結果仍然一樣。 – jrock2004

+0

1)for循環的速度是無關緊要的。即使花了10天時間執行for循環,第一個請求的回調函數也不會執行,直到for循環完成。 2)你的意思是將'async'設置爲'false',這是一個非常糟糕的解決方案。 – Paulpro

+0

下面演示瞭如何異步Javascript獨立於for循環的速度:http://jsfiddle.net/Paulpro/Etkkk/ – Paulpro