在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...");
希望这可以帮助