JavaScript / jQuery检查断开的链接

时间:2009-10-19 22:06:11

标签: javascript jquery broken-links

我开发了一个小的Javascript / jQuery程序来访问内部使用的pdf文件集合。如果文件确实存在,我希望突出显示pdf文件的信息div。

有没有办法以编程方式确定文件的链接是否已损坏?如果是这样,怎么样?

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

6 个答案:

答案 0 :(得分:57)

如果文件位于同一个域中,那么您可以使用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);
});

答案 1 :(得分:2)

问题是JavaScript具有相同的原始策略,因此您无法从其他域获取内容。这不会因为提升它而改变(想知道17票)。 我认为你需要它用于外部链接,因此不可能只使用.js ...

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

你可以$.ajax到它。如果文件不存在,您将收到404错误,然后您可以在错误回调中执行您需要的任何操作(UI方式)。这取决于你如何触发请求(计时器?)当然,如果你也有能力做一些服务器端编码你可以做一个AJAX请求 - 扫描目录,然后像JSON一样返回结果。

答案 5 :(得分:0)

正如其他人提到的那样,由于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);
});