代码之家  ›  专栏  ›  技术社区  ›  NawaMan

javascript/jquery检查断开的链接

  •  26
  • NawaMan  · 技术社区  · 15 年前

    我开发了一个小型的javascript/jquery程序来访问一组内部使用的PDF文件。如果文件确实存在的话,我希望突出显示PDF文件的信息部分。

    有没有一种方法可以通过编程确定到文件的链接是否已断开?如果是这样,怎么办?

    任何指导或建议都是适当的。

    6 回复  |  直到 6 年前
        1
  •  56
  •   Funk Forty Niner    7 年前

    如果文件在同一个域中,那么可以使用Ajax来测试它们是否存在 Alex Sexton 说; 但是,您不应该使用 GET 方法,公正 HEAD 然后检查HTTP状态中的预期值(200,或小于400)。

    下面是从 related question :

    function urlExists(url, callback) {
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
          callback(xhr.status < 400);
        }
      };
      xhr.open('HEAD', url);
      xhr.send();
    }
    
    urlExists(someUrl, function(exists) {
        console.log('"%s" exists?', someUrl, exists);
    });
    
        2
  •  2
  •   Sebastian Lasse    12 年前

    问题是,javascript具有相同的源站策略,因此您无法从其他域获取内容。这不会因为投票而改变(对17票感到疑惑)。 我认为你需要它作为外部链接,所以仅仅使用.js是不可能的…

        3
  •  1
  •   Alex Sexton    15 年前

    如果文件不在外部网站上,可以尝试对每个文件发出Ajax请求。如果它作为失败返回,那么您知道它不存在,否则,如果它完成和/或返回时间超过给定阈值,您可以猜测它存在。它并不总是完美的,但通常“filenotfound”请求很快。

    var threshold   = 500,
        successFunc = function(){ console.log('It exists!'); };
    
    var myXHR = $.ajax({
      url: $('#checkme').attr('href'),
      type: 'text',
      method: 'get',
      error: function() {
        console.log('file does not exist');
      },
      success: successFunc
    });
    
    setTimeout(function(){
      myXHR.abort();
      successFunc();
    }, threshold);
    
        4
  •  1
  •   Mike H-R    9 年前

    正如塞巴斯蒂安所说,由于同一原产地的政策,这是不可能的。如果该站点可以在公共域上发布(暂时),则可以使用其中一个链接检查器服务。我落后了 checkerr.org

        5
  •  0
  •   Bostone    15 年前

    你可以 $.ajax 对它。如果文件不存在,您将得到404错误,然后您可以在错误回调中执行您需要的任何操作(按用户界面)。由您决定如何触发请求(计时器?)当然,如果您还能够进行一些服务器端编码,那么您可以执行单个Ajax请求—扫描目录,然后返回结果,如JSON。

        6
  •  0
  •   Csa77 Bartosz Radaczyński    6 年前

    正如其他人所提到的,由于javascript的源代码策略相同,仅仅使用接受答案中的函数是行不通的。解决方法是使用代理服务器。您不必为此使用自己的代理,您可以使用此服务,例如: https://cors-escape.herokuapp.com (代码) here )

    代码如下:

    var proxyUrl = "https://cors-anywhere.herokuapp.com/";
    
    function urlExists(url, callback) {
      var sameOriginURL = proxyUrl + url;
      var xhr = new XMLHttpRequest();
      xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
          callback(xhr.status < 400);
        }
      };
      xhr.open('HEAD', sameOriginURL);
      xhr.send();
    }
    
    urlExists(someUrl, function(exists) {
      console.log('"%s" exists?', someUrl, exists);
    });