2011-01-23 59 views
2

我有問題將參數/變量傳遞到ajax()函數。jQuery將參數傳遞到.ajax()

下面的函數接受兩個參數。其中一個是'元素',即.ajax()使用的成功選項,工作正常,因此無需專注於此。 'tx'或者是像'menu'這樣的單個值,或者是由冒號分隔的一對值:「menu:categories:brands」

如果'tx'中只有一個值,那麼只有一個AJAX請求需要發送,並且工作正常。如果'tx'中有多個值,則函數split將使用「:」作爲分隔符,然後將offset [0]作爲'tx'的值傳遞給AJAX請求,然後將其餘值存儲在' X'。

我遇到的問題是一旦AJAX請求完成第一個值,遞歸運行此函數。 var'more'存儲一個bool值,如果還有更多值需要處理的話。但是,當我使用'more == true'寫入.ajax()的success或complete選項時,它不會反映存儲在該變量中的值,它總是返回false。

在回答一些問題之前,「你應該構造調用這個函數的函數,只傳遞一個值到這個參數中」,讓我們假設這是一個不可能的事情,超出了我的控制範圍。

我不知道爲什麼會發生這種情況。我知道這可能非常簡單,我可以忽略,但我現在已經上了大約16個小時,這個問題至少困擾了我至少一半。

這裏的任何幫助表示讚賞。這裏是功能:

function getContent(element, tx) { 
    e = element 
    modAmount = tx.split(':') 
    if (modAmount.length > 1) { 
     x = '' 
     tx = modAmount[0] 
     for (i=1;i<modAmount.length;i++) { 
      x = x + modAmount[i] 
      if (i != (modAmount.length)-1){ 
       x = x+":" 
      } 
     } 
     more = true 
    } 
    else { 
     more = false 
     tx = modAmount[0] 
    } 
    $.ajax({ 
     type: "POST", 
     url: "getModule.php", 
     data: "modName="+tx+"&DB=<?php echo DB ?>", 
     success: function(data){ 
      if ($(element).find('p').text() == "No Content"){ 
       $(element).find('p').remove(); 
       $(element).html("<div onclick='destroy(this)' id='destroy' class='ui-corner-all destroy' title='Remove Module'>"+data+"</div>") 
      } 
      else { 
       $(element).append("<div onclick='destroy(this)' id='destroy' class='ui-corner-all destroy' title='Remove Module'>"+data+"</div>"); 
      } 
     }, 
     complete: function() { 
      if (more == true) {alert(x)} // always returns false 
     } 
    }); 

} 
+0

感謝您的幫助。我完全忽略了可變範圍太長了。不幸的是,解決這個問題揭示了一個非常棘手的錯誤,導致無限循環。我只是要轉儲這一小段代碼,並只用一個AJAX/JSON請求重寫它。 – 2011-01-23 03:39:24

回答

1

有已經在這裏一個明顯的錯誤:你不使用關鍵字var聲明您的本地變量。這意味着在全局上下文中只有一個這樣的變量的實例。

我不確定這是否是您的問題,但確實看起來可能如此。考慮調用getContent「foo:bar」的情況。第一個呼叫集更多真實,但隨後第二個遞歸呼叫集更多回到。當第一個XmlHttpRequest完成時,完成回調將看到的值而不是true您所期待的,因爲這兩個調用共享相同變量的更多

您應該瞭解JavaScript/ECMAScript範圍的工作原理,並深入瞭解閉包在語言中的工作原理。這將防止未來發生很多頭疼的事情。谷歌周圍的道格拉斯克羅克福德的着作;這是一個很好的起點。

tl; dr:使用var關鍵字定義您的局部變量。

0

因爲「更多」不在您的回調範圍內。

我建議使用上下文屬性,您可以發送到Ajax調用來設置成功/完成回調「這個」變量:

http://api.jquery.com/jQuery.ajax/