2009-10-19 12 views
24

Ich entwickelte ein kleines Javascript/jQuery-Programm, um auf eine Sammlung von PDF-Dateien für den internen Gebrauch zuzugreifen. Und ich wollte das Informationsdiv einer PDF-Datei hervorgehoben haben, wenn die Datei tatsächlich existiert.JavaScript/jQuery überprüfen Sie defekte Links

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 angeeignet.

Antwort

52

Wenn sich die Dateien in derselben Domäne befinden, können Sie AJAX verwenden, um deren Existenz zu testen, wie in der folgenden Tabelle angegeben: Alex Sexton; jedoch sollten Sie nicht die GET-Methode, nur HEAD verwenden und dann den HTTP-Status für den erwarteten Wert (200 oder nur weniger als 400) überprüfen.

Hier ist eine einfache Methode, aus einem related question bereitgestellt:

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

Ich wünschte, ich wüsste, wie dies für die OP-Frage zu implementieren. Jemand? – Trip

+0

Was fragst du? –

+0

Ich bekomme einen Fehler mit diesem Code: "Origin http: // localhost ist nicht erlaubt von Access-Control-Allow-Origin." – rob

2

Wenn sich die Dateien nicht auf einer externen Website befinden, können Sie versuchen, für jede Datei eine AJAX-Anforderung zu stellen. Wenn es als Fehler zurückkommt, dann wissen Sie, dass es nicht existiert, andernfalls können Sie annehmen, dass es existiert, wenn es abgeschlossen und/oder länger dauert als ein gegebener Schwellenwert für die Rückgabe. Es ist nicht immer perfekt, aber in der Regel sind "nicht gefundene" Anfragen 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); 
0

Sie können $.ajax zu ihm. Wenn die Datei nicht existiert, erhalten Sie 404 Fehler und dann können Sie tun, was Sie (UI-weise) im Fehlerrückruf benötigen. Es liegt an Ihnen, wie Sie die Anfrage auslösen (Timer?). Natürlich können Sie, wenn Sie auch serverseitig codieren können, eine einzige AJAX-Anfrage machen - scannen Sie das Verzeichnis und geben Sie dann die Ergebnisse als JSON zurück.

2

Problem ist, dass JavaScript, um die Same Origin Policy hat, so dass Sie keine Inhalte von einer anderen Domäne greifen. Dies wird sich nicht ändern, indem Sie es aufheben (sich über die 17 Stimmen wundernd). Ich denke, Sie brauchen es für externe Links, so ist es unmöglich, nur mit .js ...

1

Wie Sebastian sagt, es ist nicht möglich, aufgrund der gleichen Herkunft Politik. Wenn die Site (vorübergehend) auf einer öffentlichen Domain veröffentlicht werden kann, können Sie einen der Link Checker-Dienste verwenden. Ich bin hinter checkerr.org