在Jquery / Javascript中检查URL

时间:2010-11-29 08:26:40

标签: javascript jquery 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...
}

6 个答案:

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

希望这有帮助