在Jquery / Javascript中检查URL

我需要的是一个方法,如果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... } 

这不是AJAX的工作原理。 AJAX基本上是异步的(这实际上是第一个’A’代表的意思),这意味着你调用一个函数而不是你返回一个值,你调用一个函数并传入一个回调函数,然后用这个值调用该回调。

(见http://en.wikipedia.org/wiki/Continuation_passing_style 。)

在知道URL是否响应后,您想要做什么? 如果您打算像这样使用此方法:

 //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); } }); } 

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!'); } }); 

值得一提的是相同的原产地政策 。

此外,从匿名函数的作用域返回将不会在父函数中返回 (就像在原始示例中一样)。 它只返回内部函数。 要从内部返回到父级,请设置一个标志并将其返回。

基本上,您的代码没有任何问题。 看到它在这里工作: http : //jsfiddle.net/PK76X/

我的猜测是你用它来检查不同域上内容的可用性,这会因为浏览器不允许跨域ajax请求而失败。

如果url与您的网页位于同一个域中,则可以执行此操作。 但如果它来自不同的域,例如google.com,则由于跨域安全性而失败。

通常,您应该使用firebug插件在Firefox中运行您的脚本。 它将为您提供解决问题所需的详细信息。

ajax和post方法是异步的,因此您应该在回调方法中处理结果。

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..."); 

希望这可以帮助