【问题标题】:Checking a Url in Jquery/Javascript在 Jquery/Javascript 中检查 URL
【发布时间】:2010-11-29 08:26:40
【问题描述】:

我只需要一个在 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...
}

【问题讨论】:

    标签: javascript jquery url


    【解决方案1】:

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

    【讨论】:

    • 我不确定你是不是没抓住重点,还是我……我现在想要的只是一个布尔值。
    • 更新了我的答案,给你一个布尔值,这有帮助吗?
    • 我喜欢这个答案。
    【解决方案2】:

    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 返回(如您的原始示例中)。它只是返回那个内部函数。要从内部返回到父级,设置一个标志并返回它。

    【讨论】:

    • 返回 T/F 应该不是问题,如果是这样的话,无论如何我都会失去对代码的全部意义......
    • 可以使用同步请求
    • @user205376 是的,如果您不介意锁定用户的浏览器。
    • @user474632 Returning from an inner function 不会让父级返回。
    【解决方案3】:

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

    我的猜测是您正在使用它来检查不同域上内容的可用性,但由于浏览器不允许跨域 ajax 请求而失败。

    【讨论】:

    • 有趣,那个。除了一个重要的细节外,我设法把它做对了。现在我必须想出一种不同的方法让我的网站找到正确的地址..
    • 您的 jsfiddle 中的代码和他的代码之间实际上存在根本区别:您的代码将在成功或错误时执行某些操作(在这种情况下为警报)。他的代码试图从原始函数返回一个值,这将不起作用,因为在调用成功或错误函数时原始函数已经结束。这些返回语句不是从 urlExists() 返回,而是从成功和错误函数返回。
    【解决方案4】:

    如果网址与您的页面来自同一个域,您可以这样做。但如果它来自不同的域,例如 google.com,那么由于跨域安全性,它将失败。

    【讨论】:

      【解决方案5】:

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

      ajax 和 post 方法是异步的,所以你应该在回调方法中处理结果。

      【讨论】:

        【解决方案6】:

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

        希望对你有帮助

        【讨论】:

        • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
        • 抱歉 Ohad 但您的函数将在触发成功或错误之前立即返回,因为对 ajax 的调用是异步的。因此该方法在每次调用 ajax() 后立即返回 isValid = false。不得不对这一票投反对票。对不起。
        • @JJ_Coder4Hire,你试过了吗?签出 ajax 调用。它声明:“异步:假”
        猜你喜欢
        • 2011-09-09
        • 2022-11-19
        • 1970-01-01
        • 2014-10-21
        • 2014-01-23
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 2012-08-02
        相关资源
        最近更新 更多