jQuery将参数传递给.ajax()

时间:2011-01-23 02:12:23

标签: javascript function jquery parameter-passing

我在将参数/变量传递到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
        }
    });

}

2 个答案:

答案 0 :(得分:1)

这里已经出现了一个明显的错误:你没有使用 var 关键字声明你的局部变量。这意味着在全局上下文中,这些变量中只有一个实例。

我不确定这是不是你的问题,但看起来确实如此。考虑一下你调用getContent“foo:bar”的情况。第一个调用将更多设置为 true ,但第二个递归调用将更多设置回 false 。当第一个XmlHttpRequest完成时,完成回调将看到 false 的值而不是您期望的 true ,因为这两个调用共享的相同变量更多

您应该了解JavaScript / ECMAScript范围的工作原理,并深入了解闭包在语言中的工作原理。这样可以防止将来发生很多麻烦。谷歌周围的道格拉斯克罗克福德的着作;这是一个很好的起点。

tl; dr:使用 var 关键字定义您的本地变量。

答案 1 :(得分:0)

因为“more”不在回调范围内。

我建议使用您可以发送到ajax调用的context属性来设置成功/完全回调中的“this”变量:

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