wake-up-neo.net

JavaScript/jQuery überprüfen Sie beschädigte Links

Ich habe ein kleines Javascript/jQuery-Programm entwickelt, um auf eine Sammlung von PDF-Dateien für den internen Gebrauch zuzugreifen. Und ich wollte die Informationen div einer PDF-Datei hervorheben, wenn die Datei tatsächlich vorhanden ist.

Gibt es eine Möglichkeit, programmgesteuert festzustellen, ob eine Verknüpfung zu einer Datei unterbrochen ist? Wenn das so ist, wie?

Jeder Leitfaden oder Vorschlag ist angemessen.

26
NawaMan

Wenn sich die Dateien in derselben Domäne befinden, können Sie AJAX verwenden, um ihre Existenz zu testen, wie Alex Sexton sagte; Sie sollten jedoch nicht die GET-Methode verwenden, sondern HEADund dann den HTTP-Status für den Expect-Wert überprüfen (200 oder knapp unter 400).

Hier ist eine einfache Methode aus einer bezogenen Frage :

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);
});
56
Justin Johnson

Das Problem ist, dass JavaScript dieselbe Origin-Richtlinie hat, sodass Sie keine Inhalte von einer anderen Domäne abrufen können. Das ändert sich nicht, wenn Sie es aufheben (sich über die 17 Stimmen wundern). Ich denke, Sie brauchen es für externe Links, also ist es nur mit .js unmöglich ...

2
Sebastian Lasse

Wie Sebastian sagt, ist dies aufgrund der gleichen Origin-Richtlinie nicht möglich. Wenn die Site (vorübergehend) in einer öffentlichen Domain veröffentlicht werden kann, können Sie einen der Link-Checker-Services dort verwenden. Ich bin hinter checkerr.org

1
zupa

Wenn sich die Dateien nicht auf einer externen Website befinden, können Sie versuchen, eine Ajax-Anforderung für jede Datei zu erstellen. Wenn es als Fehler zurückkehrt, wissen Sie, dass es nicht existiert. Andernfalls können Sie erraten, dass es existiert, und wenn der Schwellenwert einen bestimmten Schwellenwert überschreitet. Es ist nicht immer perfekt, aber "filenotfound" -Anfragen sind im Allgemeinen schnell.

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);
1
Alex Sexton

Wie bereits von anderen erwähnt, funktioniert die Verwendung der Funktion aus der akzeptierten Antwort aufgrund der gleichen Origin-Richtlinie von JavaScript nicht. Eine Problemumgehung besteht darin, einen Proxyserver zu verwenden. Sie müssen dafür keinen eigenen Proxy verwenden. Sie können diesen Dienst beispielsweise verwenden: https://cors-escape.herokuapp.com (code here ).

Der Code sieht so aus: 

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);
});
0
Csaba

Sie können $.ajax dazu. Wenn die Datei nicht vorhanden ist, wird der Fehler 404 angezeigt, und Sie können im Fehlercallback tun, was Sie benötigen (UI-weise). Es liegt an Ihnen, wie Sie die Anforderung auslösen (Zeitgeber?). Selbst wenn Sie auch serverseitige Codierungen durchführen können, können Sie eine einzelne AJAX -Anfrage durchführen. Überprüfen Sie das Verzeichnis und geben Sie die Ergebnisse wie in einem Beispiel zurück JSON.

0
Bostone