循环时数组的索引变为未定义

时间:2014-07-29 20:42:09

标签: javascript jquery

我正在创建一个小型域可用性检查器。为此,我将所需的域解析为一个表单,并使用jQuery AJAX将其提交给PHP文件。 然而,当我循环遍历不同的TLD时,它突然变得不明确,我无法在循环中使用“TLD”进行进一步处理。据我所知,它与首先发生的循环和之后的请求有关,所以我不得不冻结我的数组的索引。但我不知道该怎么做。

这是我的代码:

$("input[name=submit]").click(function(){
        var getDomain = $("#domainsearch").val();
        var stripDomain = getDomain.split(".");
        var domain = stripDomain[0];
        var tlds = ["dk", "se", "com", "net"];
        for (var i = 0; i < tlds.length; i++ ) {
            var dataString = "domain=" + domain + "." + tlds[i];
            console.log(dataString);
            $.ajax({
                type: "POST",
                url: "search.php",
                data: dataString,
                success: function(data) {
                    console.log(domain + "." + tlds[i] + " is " + data);
                }
            });
        };
        return false;
    });

打印的console.log看起来像这样: enter image description here

3 个答案:

答案 0 :(得分:2)

这是经典 JavaScript问题。在success函数(闭包)中,正在使用i。一旦AJAX调用完成,该回调将在未来运行。到那时,循环已经完成,i已经增加到4

tlds[4]不存在,这就是您获得undefined的原因。回调都使用相同的 i值。

要修复它,您需要创建一个新函数来捕获每个回调的i值。

$("input[name=submit]").click(function(){
    var getDomain = $("#domainsearch").val();
    var stripDomain = getDomain.split(".");
    var domain = stripDomain[0];
    var tlds = ["dk", "se", "com", "net"];

    var createCallback = function(i){
        return function(data) {
            console.log(domain + "." + tlds[i] + " is " + data);
        };
    }

    for (var i = 0; i < tlds.length; i++ ) {
        var dataString = "domain=" + domain + "." + tlds[i];
        console.log(dataString);
        $.ajax({
            type: "POST",
            url: "search.php",
            data: dataString,
            success: createCallback(i)
        });
    };
    return false;
});

答案 1 :(得分:1)

ajax调用返回时,循环早已结束,i已超过tlds的结尾。试图打印tlds[i]肯定会失败。

将查找分解为单独的函数,其中的局部变量在ajax回调中有效:

var checkup = function(datastring, domain, tld) {
  $.ajax({
    type: "POST",
    url: "search.php",
    data: dataString,
    success: function(data) {
      console.log(domain + "." + tld + " is " + data);
    }
  });
};

for (var i = 0; i < tlds.length; i++ ) {
  var dataString = "domain=" + domain + "." + tlds[i];
  console.log(dataString);

  checkup(datastring, domain, tlds[i]);
};

答案 2 :(得分:0)

您需要将循环中的代码括在闭包中,如下所示:

$("input[name=submit]").click(function(){
    var getDomain = $("#domainsearch").val();
    var stripDomain = getDomain.split(".");
    var domain = stripDomain[0];
    var tlds = ["dk", "se", "com", "net"];
    for (var i = 0; i < tlds.length; i++ ) {
        (function() {
            var dataString = "domain=" + domain + "." + tlds[i];
            console.log(dataString);
            $.ajax({
                type: "POST",
                url: "search.php",
                data: dataString,
                success: function(data) {
                    console.log(domain + "." + tlds[i] + " is " + data);
                }
            });
        })( i );
    }
    return false;
});