jQuery将参数传递到.ajax()
我有问题将参数/变量传递到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
}
});
}
有已经在这里一个明显的错误:你不使用关键字var声明您的本地变量。这意味着在全局上下文中只有一个这样的变量的实例。
我不确定这是否是您的问题,但确实看起来可能如此。考虑调用getContent“foo:bar”的情况。第一个呼叫集更多到真实,但随后第二个递归呼叫集更多回到假。当第一个XmlHttpRequest完成时,完成回调将看到假的值而不是true您所期待的,因为这两个调用共享相同变量的更多。
您应该了解JavaScript/ECMAScript范围的工作原理,并深入了解闭包在语言中的工作原理。这将防止未来发生很多头疼的事情。谷歌周围的道格拉斯克罗克福德的着作;这是一个很好的起点。
tl; dr:使用var关键字定义您的局部变量。
感谢您的帮助。我完全忽略了可变范围太长了。不幸的是,解决这个问题揭示了一个非常棘手的错误,导致无限循环。我只是要转储这一小段代码,并只用一个AJAX/JSON请求重写它。 – 2011-01-23 03:39:24