使用Jquery/Javascript检查Url

7

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

25
这不是 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);
    }
  });
}

我不确定是你没有理解重点还是我...现在我只想要一个布尔值。 - user474632
我更新了我的答案,给你一个布尔值,这样有帮助吗? - Han Seoul-Oh
1
我喜欢这个答案。 - jeffery_the_wind

6

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

值得一提的是 同源策略
同时,从匿名函数作用域返回不会返回到父函数(就像在您原始的示例中一样)。它只会返回内部函数。要从内部返回到父级,请设置一个标志并返回它。

返回T/F不应该是一个问题,如果是的话,我将失去代码的全部意义... - user474632
可以使用同步请求,不过 - Free Consulting
@user205376 如果您不介意让用户的浏览器被锁定,那么可以这样做。 - alex
@user474632 在内部函数中使用return语句并不会使父函数返回。 - alex

2
基本上,你的代码没有问题。在这里查看它的工作情况:http://jsfiddle.net/PK76X/ 我猜测你正在使用它来检查不同域上内容的可用性,这会失败,因为浏览器不允许跨域ajax请求。

有趣的是,我成功地完成了除一个重要细节之外的所有工作。现在我必须考虑一个不同的方法来让我的网站找到正确的地址。 - user474632
1
实际上,你的jsfiddle代码和他的代码之间存在根本性的区别:你的代码会在成功或错误时执行某些操作(在这种情况下是警报)。他的代码尝试从原始函数返回一个值,但这行不通,因为在调用成功或错误函数时,原始函数已经结束。那些return语句并不是从urlExists()返回的,而是从成功和错误函数返回的。 - Han Seoul-Oh

1
如果URL与您的页面来自同一域,则可以这样做。但是,如果它来自不同的域,例如google.com,则由于跨域安全性而失败。

1
一般来说,你应该在 Firefox 中使用 firebug 插件运行脚本。它会给你解决问题所需的详细信息。
ajax 和 post 方法是异步的,因此你应该在回调方法中处理结果。

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

希望这能有所帮助


1
虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅有链接的答案可能会失效。 - vonbrand
抱歉Ohad,但是你的函数会在触发成功或错误之前立即返回,因为对ajax的调用是异步的。因此,在调用ajax()后,该方法立即返回isValid = false,每次都是如此。必须否决此项。抱歉。 - JJ_Coder4Hire
@JJ_Coder4Hire,你试过了吗?看一下ajax调用。它声明:“async:false”。 - Ohad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接