我需要的是一个方法,如果Url响应,则返回true。不幸的是,我是jQuery的新手,它让我尝试编写这种方法相当令人沮丧。
我已经看过几个使用.ajax的jQuery示例,但代码一直在我身上失败。怎么了?
var urlExists = function(url){
//When I call the function, code is still executing here.
$.ajax({
type: 'HEAD',
url: url,
success: function() {
return true;
},
error: function() {
return false;
}
});
//But not here...
}
答案 0 :(得分:20)
这不是AJAX的工作原理。 AJAX基本上是异步的(实际上是第一个'A'代表的意思),这意味着而不是你调用一个函数并且它返回一个值,你调用一个函数并传入一个回调函数,并且将使用该函数调用该回调
(见http://en.wikipedia.org/wiki/Continuation_passing_style。)
在您知道网址是否响应后,您想要做什么?如果您打算像这样使用此方法:
//do stuff
var exists = urlExists(url);
//do more stuff based on the boolean value of exists
然后你要做的是:
//do stuff
urlExists(url, function(exists){
//do more stuff based on the boolean value of exists
});
其中urlExists()
是:
function urlExists(url, callback){
$.ajax({
type: 'HEAD',
url: url,
success: function(){
callback(true);
},
error: function() {
callback(false);
}
});
}
答案 1 :(得分:5)
urlExists()
无法返回,因为它需要等待请求。
要么传递回调,要么使其同步(不推荐,因为它会锁定浏览器)。
var urlExists = function(url, callback) {
if ( ! $.isFunction(callback)) {
throw Error('Not a valid callback');
}
$.ajax({
type: 'HEAD',
url: url,
success: $.proxy(callback, this, true),
error: $.proxy(callback, this, false)
});
};
然后你可以做
urlExists('/something', function(success) {
if (success) {
alert('Yay!');
} else {
alert('Oh no!');
}
});
还值得一提的是same origin policy。
此外,从父函数中的匿名函数范围will not return返回(就像在原始示例中一样)。它只返回内部函数。要从内部返回到父级,请设置一个标志并将其返回。
答案 2 :(得分:2)
基本上,您的代码没有任何问题。看到它在这里工作: http://jsfiddle.net/PK76X/
我的猜测是,您正在使用它来检查其他域上内容的可用性,但由于浏览器不允许跨域ajax请求,因此会失败。
答案 3 :(得分:1)
如果网址与您的网页位于同一个域中,则可以执行此操作。但如果它来自不同的域名,例如google.com,则会因跨域安全而失败。
答案 4 :(得分:1)
通常,您应该使用firebug插件在Firefox中运行您的脚本。它将为您提供解决问题所需的详细信息。
ajax和post方法是异步的,因此您应该在回调方法中处理结果。
答案 5 :(得分:-1)
AJAX基本上是异步的,这就是你所描述的行为的原因。 我使用了以下内容,它没有交叉来源,以同步的方式获得一个简单的真/假指示URL是否有效:
function isValidURL(url) {
var encodedURL = encodeURIComponent(url);
var isValid = false;
$.ajax({
url: "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20html%20where%20url%3D%22" + encodedURL + "%22&format=json",
type: "get",
async: false,
dataType: "json",
success: function(data) {
isValid = data.query.results != null;
},
error: function(){
isValid = false;
}
});
return isValid;
}
用法很简单:
var isValid = isValidURL("http://www.wix.com");
alert(isValid ? "Valid URL!!!" : "Damn...");
希望这有帮助