在Jquery/Javascript中检查URL

anhgbhbe  于 2023-01-25  发布在  jQuery
关注(0)|答案(6)|浏览(131)

我所需要的只是一个在URL响应时返回true的方法,不幸的是,我是jQuery的新手,它让我在编写该方法时相当沮丧。
我看过几个jQuery使用. AJAX 的例子,但是代码总是失败。

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...
}
e0bqpujr

e0bqpujr1#

AJAX的工作原理不是这样的。AJAX基本上是异步的(这实际上是第一个"A"所代表的),这意味着不是你调用一个函数,它会返回一个值,而是你调用一个函数,传入一个回调函数,这个回调函数会被调用。
(See 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);
    }
  });
}
knsnq2tg

knsnq2tg2#

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返回(就像你最初的例子)。它只返回内部函数。要从内部函数返回父函数,设置一个标志并返回它。

xj3cbfub

xj3cbfub3#

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

6yt4nkrj

6yt4nkrj4#

如果url和你的页面来自同一个域,你可以这样做,但是如果它来自不同的域,例如google.com,那么由于跨域安全,它将失败。

w9apscun

w9apscun5#

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

0vvn1miw

0vvn1miw6#

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

希望这能帮上忙

相关问题