Andreas D: relatven Pfad von Link ermitteln.

wenn ich mit JavaScript z.B mit

document.getElementsByTagName("a")[5].href

das Ziel aus einem Link auslese bekomme ich immer einen absoluten Pfad. Auch wenn z.B. im Dokument etwas in der Art steht:

<a href="seiten/bsp.hrml">Beispielseiten<a>

Ich bräuchte aber eigentlich einen relativen Pfad. Also was könnte ich tun?
Ich hoffe mir kann jemand einen Tipp geben.
Vielen Dank schon mal im Voraus.

  1. Hi,

    Ich bräuchte aber eigentlich einen relativen Pfad. Also was könnte ich tun?

    das Attribut mittels getAttribute() auslesen, nicht die generierte href-Eigenschaft verwenden. Beachte, dass der IE bis (IIRC) einschließlich Version 7 bei dieser leichten Übung versagt.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. schon mal besser. Mit getAttribute("href") bekomme ich den relativen Pfad. Aber leider nicht im IE. Da bekomme ich auch mit getAttribute("href") auch nur absolute Pfade.
      Hat vielleicht noch jemand ne Idee was ich mit dem IE machen könnte (mal wieder laut aber MS fluchen)?

  2. Hi,

    Ich bräuchte aber eigentlich einen relativen Pfad. Also was könnte ich tun?

    Stringfunktionen bemuehen, um das "unerwuenschte" wegzuschneiden.

    MfG ChrisB

    1. Stringfunktionen bemuehen, um das "unerwuenschte" wegzuschneiden.

      Hab ich auch schon dran gedacht. Aber wie wies ich was ich vom absollen Pfad wegschneiden muss um einen relativen zu bekommen?

      1. Hi,

        Stringfunktionen bemuehen, um das "unerwuenschte" wegzuschneiden.

        Hab ich auch schon dran gedacht. Aber wie wies ich was ich vom absollen Pfad wegschneiden muss um einen relativen zu bekommen?

        Naja, Du brauchst, um einen korrekten relativen Pfad zu berechnen, den Ausgangspfad des Dokuments.

        Dann kannst Du das z.B. in folgende Funktion packen:

        /*  
         * Berechne einen relativen Pfad von quelle nach ziel  
         */  
        function berechneRelativenPfad (ziel, quelle) {  
            // wir gehen davon aus, dass es sich hier um absolute URIs  
            // handelt wie bei file, http, https oder ftp  
          
            // zuerst entfernen wir alles was '?' oder '#' beinhaltet  
            var normalisiere = function (zeichenkette) {  
                var i1 = zeichenkette.indexOf ('?');  
                var i2 = zeichenkette.indexOf ('#');  
                if (i1 != -1) {  
                    if (i2 != -1 && i2 < i1) {  
                        return [zeichenkette.substr (0, i2), zeichenkette.substr (i2)];  
                    } else {  
                        return [zeichenkette.substr (0, i1), zeichenkette.substr (i1)];  
                    }  
                } else if (i2 != -1) {  
                    return [zeichenkette.substr (0, i2), zeichenkette.substr (i2)];  
                } else {  
                    return [zeichenkette, ''];  
                }  
            }  
          
            quelle = normalisiere (quelle);  
            ziel = normalisiere (ziel);  
            // zuerst trennen wir beide Angaben nach / auf.  
            var zielKomponenten = ziel[0].split ('/');  
            var quellKomponenten = quelle[0].split ('/');  
            // nun sehen wir uns die gleichen komponenten an  
            var i;  
            for (i = 0; i < zielKomponenten.length && i < quellKomponenten.length; i++) {  
                if (zielKomponenten[i] != quellKomponenten[i]) {  
                    break;  
                }  
            }  
            // pfade identisch  
            if (i == zielKomponenten.length && i == quellKomponenten.length) {  
                // gib nur anker o.ä. zurück  
                if (ziel[1].length) {  
                    return ziel[1];  
                }  
                // Linkziel endet nicht auf /, damit können wir einfach die letzte  
                // Komponente zurückgeben  
                if (zielKomponenten[i-1].length) {  
                    return zielKomponenten[i-1];  
                }  
                // Ok, Linkziel endet auf / und ist identisch zur Linkquelle  
                // Also ./ zurückgeben  
                return './';  
            }  
            var ausgabe = '';  
            // suche dir einen Weg zurückn  
            for (var j = i; j < quellKomponenten.length - 1; j++) {  
                ausgabe += '../';  
            }  
            ausgabe += zielKomponenten.slice (i).join ('/');  
            // hänge ?... oder #... noch ran  
            return ausgabe + ziel[1];  
        }
        

        Sie ist nicht perfekt - andere Hostnamen erkennt sie zum Beispiel nicht (d.h. wenn es wirklich ein komplett absoluter Link ist). Und man kann das sicher noch eleganter scheiben, das war eher ein Schnellschuss von mir. Aber sie liefert für Links auf dem gleichen Server (oder lokale Links) das korrekte Ergebnis:

        js> berechneRelativenPfad ('hallo/die/welt/ist/schoen', 'hallo/das/welt/ist/schoen?b=c/d')  
        ../../../die/welt/ist/schoen  
        js> berechneRelativenPfad ('hallo', 'hallo')  
        hallo  
        js> berechneRelativenPfad ('hallo?a=b', 'hallo?a=b')  
        ?a=b  
        js> berechneRelativenPfad ('http://de.selfhtml.org/xml/index.htm', 'http://de.selfhtml.org/javascript/index.htm')  
        ../xml/index.htm
        

        usw. usf.

        Viele Grüße,
        Christian

        1. vielen Dank für die Arbeit. So was in der Art werde ich wohl machen müssen.
          Habe gehofft dass es eine einfachere Möglichkeit gibt.