web-dev-qa-db-de.com

So prüfen Sie mit Javascript, ob die Seite existiert

<a href="http://www.example.com">Hello</a>

wenn ich auf den Link klicke, sollte geprüft werden, ob die Seite existiert oder nicht. Wenn es existiert, wird zu dieser Seite (www.example.com) weitergeleitet. Wenn die Seite jedoch nicht vorhanden ist, wird sie an eine andere URL weitergeleitet.

21
anish

Es hängt davon ab, ob die Seite in derselben Domäne vorhanden ist oder nicht. Wenn Sie feststellen möchten, ob eine Seite in einer externen Domäne vorhanden ist, funktioniert dies nicht. Die Browsersicherheit verhindert domänenübergreifende Aufrufe (dieselbe Origin-Richtlinie).

Wenn es jedoch ist in derselben Domäne ist, können Sie jQuery wie von Buh Buh empfohlen verwenden. Obwohl ich empfehlen würde, eine HEAD-Anfrage anstelle der GET-Anfrage durchzuführen, tut dies die Standardmethode $.ajax() - die $.ajax()-Methode lädt die gesamte Seite herunter. Wenn Sie eine HEAD - Anforderung ausführen, werden nur die Header zurückgegeben und angegeben, ob die Seite vorhanden ist (Antwortcodes 200 - 299) oder nicht (Antwortcodes 400 - 499). Beispiel:

$.ajax({
    type: 'HEAD',
    url: 'http://yoursite.com/page.html',
success: function() {
        // page exists
},
error: function() {
        // page does not exist
}
});

Siehe auch: http://api.jquery.com/jQuery.ajax/

61
fwielstra

Eine ziemlich gute Lösung ist der Proxy. Wenn Sie keinen Zugriff auf eine Serverseite haben, können Sie YQL verwenden. Besuchen Sie: http://developer.yahoo.com/yql/console/

Von dort aus können Sie Folgendes tun: select * from htmlstring where url="http://google.com". Sie können die "REST-Abfrage", die sie auf dieser Seite haben, als Ausgangspunkt für Ihren Code verwenden. 

Hier ist ein Code, der eine vollständige URL akzeptiert und YQL verwendet, um festzustellen, ob diese Seite vorhanden ist:

function isURLReal(fullyQualifiedURL) {
    var URL = encodeURIComponent(fullyQualifiedURL),
        dfd = $.Deferred(),
        checkURLPromise = $.getJSON('http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20htmlstring%20where%20url%3D%22' + URL + '%22&format=json');

    checkURLPromise
            .done(function(response) {
                // results should be null if the page 404s or the domain doesn't work
                if (response.query.results) { 
                    dfd.resolve(true);
                } else {
                    dfd.reject(false);
                }
            })
            .fail(function() {
                dfd.reject('failed');
            });
    });

    return dfd.promise();
}

// usage
isURLReal('http://google.com')
        .done(function(result) {
            // yes
        })
        .fail(function(result) {
            // no, or request failed
        });

Update 2. August 2017

Es sieht aus wie Yahoo "select * from html" veraltet, obwohl "select * from htmlstring" funktioniert.

7
Parris

Basierend auf der Dokumentation zu XMLHttpRequest:

function returnStatus(req, status) {
  //console.log(req);
  if(status == 200) {
    console.log("The url is available");
    // send an event
  }
  else {
    console.log("The url returned status code " + status);
    // send a different event
  }
}

function fetchStatus(address) {
 var client = new XMLHttpRequest();
 client.onreadystatechange = function() {
  // in case of network errors this might not give reliable results
  if(this.readyState == 4)
   returnStatus(this, this.status);
 }
 client.open("HEAD", address);
 client.send();
}

fetchStatus("/");

Dies funktioniert jedoch nur für URLs innerhalb derselben Domäne wie die aktuelle URL. Möchten Sie externe Dienste pingen können? In diesem Fall können Sie auf dem Server ein einfaches Skript erstellen, das Ihre Arbeit für Sie erledigt, und es mit JavaScript aufrufen.

4
stef

warum erstellen Sie nicht einfach einen benutzerdefinierten 404-Handler auf dem Webserver? Dies ist wahrscheinlich der "gute Bär" Weg, dies zu tun.

2
tenfour

Wenn es sich in derselben Domäne befindet, können Sie eine Kopfanforderung mit dem xmlhttprequest-Objekt [ajax] stellen und den Statuscode überprüfen. 

Wenn es sich in einer anderen Domäne befindet, machen Sie einen xmlhttprequest an den Server und lassen Sie ihn aufrufen, um zu sehen, ob er aktiv ist.

2
epascarello

Wenn Sie jQuery verwenden möchten, können Sie Folgendes tun: Wenn die Seite geladen wird, rufen Sie für jeden Link einen Ajax-Aufruf auf. Dann ersetzen Sie einfach die Href aller Links, die fehlschlagen.

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script> 
<script type="text/javascript">
<!--

$.fn.checkPageExists = function(defaultUrl){

    $.each(this, function(){

        var $link = $(this);

        $.ajax({
            url: $link.attr("href"),
            error: function(){
                $link.attr("href", defaultUrl);
            }
        });
    });
};

$(document).ready(function(){
    $("a").checkPageExists("default.html");
});
//-->
</script> 
1
Buh Buh
$.ajax({
        url: "http://something/whatever.docx",
        method: "HEAD",
        statusCode: {
            404: function () {
                alert('not found');
            },
            200: function() {
            alert("foundfile exists");
        }
        }
    });
0
Tomas