2011-01-23 41 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/