我在将参数/变量传递到ajax()函数时遇到问题。
以下功能接受两个参数。一个是'element',.ajax()使用的成功选项,工作正常,因此无需关注它。 'tx'可以是单个值,如'menu',也可以是冒号分隔的几个值,如下所示:“menu:categories:brands”
如果'tx'中只有一个值,那么只需要发送一个AJAX请求就行了。如果'tx'中有多个值,则使用“:”分隔它的函数是分隔符,然后将offset [0]作为'tx'的值传递给AJAX请求,然后将其余的值存储在'' X”。
我遇到的问题是,一旦AJAX请求完成第一个值,就会递归地运行此函数。如果还有更多值要处理,var'more'存储bool值。但是,当我使用'more == true'在.ajax()的成功或完整选项中写入if参数时,它不会反映存储在该变量中的值,它总是返回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 :(得分:1)
这里已经出现了一个明显的错误:你没有使用 var 关键字声明你的局部变量。这意味着在全局上下文中,这些变量中只有一个实例。
我不确定这是不是你的问题,但看起来确实如此。考虑一下你调用getContent“foo:bar”的情况。第一个调用将更多设置为 true ,但第二个递归调用将更多设置回 false 。当第一个XmlHttpRequest完成时,完成回调将看到 false 的值而不是您期望的 true ,因为这两个调用共享的相同变量更多
您应该了解JavaScript / ECMAScript范围的工作原理,并深入了解闭包在语言中的工作原理。这样可以防止将来发生很多麻烦。谷歌周围的道格拉斯克罗克福德的着作;这是一个很好的起点。
tl; dr:使用 var 关键字定义您的本地变量。
答案 1 :(得分:0)
因为“more”不在回调范围内。
我建议使用您可以发送到ajax调用的context属性来设置成功/完全回调中的“this”变量: