Link nur, wenn Datei vorhanden

Rebelution

Grünschnabel
Hallo,

ich habe folgende Frage zu JS:

ist es mit JS möglich, einen bestimmten Text nur dann zu einem Link zu machen, wenn die Datei, auf die verlinkt werden soll, tatsächlich vorhanden ist?

Oder in der Umkehrung: ist die verlinkte Datei nicht vorhanden, ist auch der Text auch kein Link.


Würde mich freuen, wenn mir jemand helfen kann, vielen Dank!
 
Probiers mal so:
Frage per AJAX die Zieladresse ab, wenn der StatusCode 200 ist, existiert die Datei.

Aber gib 8.... frage den HTTP-Status bereits bei readystate 3 ab und breche danach ab, sonst lädts du die ganzen Daten....das könnte etwas teuer werden, jenachdem wieviel Traffic du bei deinem Provider inklusive hast :-)
 
Danke schon mal Sven,

hast mich schon sehr viel weiter gebracht. Ganz wichtig, jetzt zu wissen, dass ich Ajax einsetzen muss.
Hab mir dazu gleich noch ne Anregung von http://developer.mozilla.org/de/docs/AJAX:Getting_Started geholt.

Code:
<script type="text/javascript" language="javascript">

    var http_request = false;

    function macheRequest(url) {

        http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
                // zu dieser Zeile siehe weiter unten
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
            return false;
        }
        http_request.onreadystatechange = alertInhalt;
        http_request.open('GET', url, true);
        http_request.send(null);

    }

    function alertInhalt() {

        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
                alert(http_request.responseText);
            } else {
                alert('Bei dem Request ist ein Problem aufgetreten.');
            }
        }

    }
</script>
<span
    style="cursor: pointer; text-decoration: underline; color: blue"
    onclick="macheRequest('test.html')">Einen Request absetzen
</span>

Ich bin mir nun aber nicht sicher, ob das Script das Richtige ist. So wie ich das rauslese, prüft das Script erst, wenn der Link angeklickt wird. Mir wäre dabei aber sehr wichtig, dass der Link erst gar nich als solcher angezeigt wird. Soll heißen, schon beim Laden der Seite müsste das Script prüfen, ob für einen bestimmten Text die entsprechende Linkdatei vorhanden ist, wenn ja, wird der Text zum Link, wenn nein, bleibt der Text normaler Text.

Kannst du mir da nochmal helfen?
 
Also im Grunde ist es recht einfach. Wie ich jetzt auf Anhieb sehe, hast du zwei Möglichkeiten. Möglichkeit 1 wäre die einfachste:

Du erstellst ein Array mit allen Links, die du hast und Itterierst dann (z.B. mir einer For Schleife) diese durch. Dann weißt du, welche du einblenden musst.

Die zweite ist etwas komplizierter. Mit getElementByTag('a') bekommst du alle Links auf der Seite. Von diesen kannst du dann die .href Eigenschaft auslesen und dann anhand dieser entscheiden, ob der Link bleiben soll oder nicht. Das Ausblenden funktioniert dann auch ganz einfach, du bist quasi schon an der Stelle, wo der Link nicht geht, also kannst du einfach per CSS display:none; definieren. Ein Nachteil ist, dass es etwas dauern kann, bis die Fehlerhaften Links beseitigt wurden.
 
Aber achte dabei wie gesagt auf den readyState:
Code:
if (http_request.readyState == 4) {

...aus der 4 musst du eine 3 machen, du willst ja schliesslich nur wissen, ob etwas da ist und es nicht laden lassen.
 
Port29

Danke für die Lösungsmöglichkeiten!

Leider blick ich noch nich so gut durch, dass ich beide nun auf Anhieb hinbekommen würde, muss also erstmal noch etwas dran basteln.

Nur dass ich deine Ideen richtig verstehe; bei Lösung 1 würde die for-Schleife den macheRequest auslösen und je nach Ergebnis den Text als Link ausgeben oder nicht, oder hab ich das jetzt falsch verstanden?

Bei Lösung 2 versteh ich noch nicht ganz, wie ich href-Eigenschaften mit dem macheRequest verknüpfen soll, sodass sich das auch alles automatisch beim Laden einstellt. Hab da wie gesagt noch nich den großen Durchblick.
Zudem hast du wohl recht, es ist recht unpraktisch, wenn das Ganze etwas Zeit in Anspruch nimmt.

@Sven: Danke für den Hinweis nochmal, aber glaube, das is das kleinste Problem! ;-)

Also, schon mal Danke euch beiden, ich bastel jetzt noch etwas dran und schaue mal, was ich alleine schaffe.
 
Kann mir hier jemand noczhmal nen Hinweis geben? Ich komm alleine leider echt nicht weiter ...

bin ich eigentlich der einzige mit diesem Problem? Irgendwie kann ich nich ganz glauben, dass sonst niemand einen Code in der Art wie ich benötigt ...


Also, nochmal kurz zur Erklärung. Ich habe innerhalb einer Tabelle einer HTML-Seite mehrere Links. Diese Links sollen aber nur dann als Links angezeigt werden, wenn die Datei, auf die der jeweilige Link verweist, tatsächlich besteht. Ansonsten soll einfach nur der Text ohne Link dastehen.

Beispiel:

bei vorhandener Seite "01.htm":

... <a href="01.htm">01</a> ...


bei nicht vorhandener Seite "01.htm":

... 01 ...


und der dafür benötigte Code sollte direkt beim Laden der Seite aktiv werden und alle Links, deren Seite nicht vorhanden ist, zu normalem Text ohne Link machen.

Dürfen gerne auch andere Lösungsvorschläge wie z.B. php kommen, falls es da was gibt ...


Danke nochmal für die Mithilfe, bin mittlerweile echt am Verzweifeln.
 
um zu zeigen, dass ich hier durchaus auch was dafür tue und selbst probiere, poste ich hier mal eine simplere Variante, die ich aber leider auch nich zum funktioneren bekomme.
ich glaube, ich bin echt zu schlecht für das Ganze.

Code:
      <td width="25" height="25" align="right" valign="baseline" colspan="2" onload="javascript:'macheRequest('01.htm')'">
      
      
      
      
      
      <script type="text/javascript">


   var http_request = false;

    function macheRequest('01.htm') {

        http_request = false;

        if (window.XMLHttpRequest) { // Mozilla, Safari,...
            http_request = new XMLHttpRequest();
            if (http_request.overrideMimeType) {
                http_request.overrideMimeType('text/xml');
                // zu dieser Zeile siehe weiter unten
            }
        } else if (window.ActiveXObject) { // IE
            try {
                http_request = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {
                try {
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {}
            }
        }

        if (!http_request) {
            alert('Ende :( Kann keine XMLHTTP-Instanz erzeugen');
            return false;
        }
        http_request.onreadystatechange = alertInhalt;
        http_request.open('GET', url, true);
        http_request.send(null);

    }

    function alertInhalt() {

        if (http_request.readyState == 3) {
		if (http_request.status == 200) {
			document.getElementById('16').innerHTML ="<a href="01.htm">01</a>;

}
}
}
      </script>
      
      <span id="01">01</span>
      
      
      
      
      </td>


in diesem Fall spielt sich der Code, oder sollte zumindest, nur innerhalb einer Tabellenzelle ab, in der "01" bei Vorhandensein von "01.htm" zum Link <a href="01.htm">01</a> wird. Klappt leider nicht, ich weiß nicht, wieso.
 
Moin,...

in deinem Skript sind diverse Syntax-und sonstige Fehler.

Aber ungeachtet dessen...ich hab die Sache mal bereinigt von Selbigen probiert:
Leider verrät der IE den Statuscode erst bei readyState 4...ich befürchte daher, diese Sache ist für die Praxis eher nicht geeignet...wegen dem bereits angesprochenen Problem des bereits erfolgtem Datenaustausches bei readyState 4 incl. des damit verbundenen Traffics.
 

Neue Beiträge

Zurück