我正在创建一个小型域可用性检查器。为此,我将所需的域解析为一个表单,并使用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看起来像这样:
答案 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;
});