Kurt: url eins js-scripts im js-script selbst auslesen

Hallo,

meine Bitte an die Javascript-Experten:
Eine HTML-Datei bindet eine externe Javascript-Datei ein.
In dieser Javascript-Datei selbst will ich nun feststellen, von welcher Adresse diese JS-Datei (NICHT die HTML-Datei!!) geladen wurde.

Meine Frage kann man das in Javascript tun und falls ja wie?

herzlichen Dank

Kurt

  1. Hallo,

    Meine Frage kann man das in Javascript tun und falls ja wie?

    Ich sag mal NEIN, sowas wie location oder url gibts AFAIK nur für HTML.

    Es sei denn ... du schreibst in die JS-Datei den Pfad explizit in eine Variable rein.(var path=...;)

    Obwohl ... wenn du viel Aufwand betreiben willst könntest du im DOM der HTML-Seite rumsuchen welche Scriptfade eingetragen wurden... praktisch mag man das aber nicht machen.

    Aber ich vermute du willst eh etwas realisieren das anders viel einfacher und sauberer ginge...

    Gruß
     Kurt

    1. Hallo,

      Meine Frage kann man das in Javascript tun und falls ja wie?

      Ich sag mal NEIN, sowas wie location oder url gibts AFAIK nur für HTML.

      Es sei denn ... du schreibst in die JS-Datei den Pfad explizit in eine Variable rein.(var path=...;)

      Obwohl ... wenn du viel Aufwand betreiben willst könntest du im DOM der HTML-Seite rumsuchen welche Scriptfade eingetragen wurden... praktisch mag man das aber nicht machen.

      Aber ich vermute du willst eh etwas realisieren das anders viel einfacher und sauberer ginge...

      Gruß
      Kurt

      Danke für die prompte Antwort,

      schade. das direkte reinschreiben des pfades wollte ich eigentlich vermeiden und flexibel automatisieren ....

      Kurt

      1. Hi

        Danke für die prompte Antwort,

        schade. das direkte reinschreiben des pfades wollte ich eigentlich vermeiden und flexibel automatisieren ....

        erzähl was du erreichen willst!

        (und ich versprech dir zahlreiche besserwisserische Kommentare des Forums was man erreichen will, und wie es dann geht. ;)

        Ciao
         Kurt

        PS: Zitier lieber nur worauf du bezug nimmst.

  2. Grütze .. äh ... Grüße!

    meine Bitte an die Javascript-Experten:
    Eine HTML-Datei bindet eine externe Javascript-Datei ein.
    In dieser Javascript-Datei selbst will ich nun feststellen, von welcher Adresse diese JS-Datei (NICHT die HTML-Datei!!) geladen wurde.

    Meine Frage kann man das in Javascript tun und falls ja wie?

    Heißt das nun, du kannst die JS-Datei ändern? Falls ja: Dann greifst du einfach auf die im Dokument genutzten script-Elemente zu und kannst dann für diese das Attribut src auslesen

    also z.B. Referenzen der Script-Tags per getElementsByTagname einsammeln und evtl. per schleife abarbeiten.

    .. dann steht die URL in elementreferenz.src, falls src vergeben wurde (mit if abfragen, es könnten ja noch andere script-elemente mit direktem Code ohne src-Attribut im <body> oder <head>-Bereich sein. Aus diesem Grund (habe auch schon gesehen, daß ein ext. JS als letztes vor dem schließenden body tag eingebunden wurde) sollte die Element-Abfrage erst nach einem onload-event erfolgen.


    Kai

    --
    What is the difference between Scientology and Microsoft? One is an
    evil cult bent on world domination and the other was begun by L. Ron
    Hubbard.
    ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|
    1. Hi

      ..  sollte die Element-Abfrage erst nach einem onload-event erfolgen.

      Ich vermute er will innerhalb einer Scriptdatei den eignen Pfad auswerten.

      Dann könnte er tatsächlich annehmen dass jeweils das letzte Element des Arrays das "getElementsByTagname" zurückliefert auch der aktuelle Pfad ist, da das DOM sukzessive aufgebaut wird (werden sollte)

      Ob das aber wirklich konsistent in allen Browsern so funktioniert?
      Bei einigen älteren hätte ich da Zweifel, da müsste man ausgiebig testen.

      Bye
        Kurt

      1. Dann könnte er tatsächlich annehmen dass jeweils das letzte Element des Arrays das "getElementsByTagname" zurückliefert auch der aktuelle Pfad ist, da das DOM sukzessive aufgebaut wird (werden sollte)

        Ob das aber wirklich konsistent in allen Browsern so funktioniert?

        Ja.

        Bei einigen älteren hätte ich da Zweifel, da müsste man ausgiebig testen.

        Kommt drauf an, wie alt?
        IE 4, kennt kein getElementsByTagName nur all.tags(...) und IE 5 weiß ich nicht, müßte aber gehen. NC 4 geht gar nicht.

        Struppi.

        1. Hi

          Kommt drauf an, wie alt?

          wie schon mal erwähnt habe ich ziemlich komische Erfahrungen mit Operas gesammelt. V5-6 oder so.

          Bei welchem Browser ich das gesehen habe weiß ich nicht mehr aber da wurde das DOM erst zum Zeitpunkt von OnLoad fertig aufgebaut...

          bye
           Kurt

        2. Moin!

          Dann könnte er tatsächlich annehmen dass jeweils das letzte Element des Arrays das "getElementsByTagname" zurückliefert auch der aktuelle Pfad ist, da das DOM sukzessive aufgebaut wird (werden sollte)

          Ob das aber wirklich konsistent in allen Browsern so funktioniert?

          Ja.

          Nein.

          Es gibt keinen Standard, der definiert, wie das DOM des Dokuments sich verhalten soll, während das Dokument noch geladen wird, und was in so einem Fall zurückgegeben werden soll. Alle Definitionen funktionieren erst dann, wenn das Dokument tatsächlich komplett geladen im Speicher steht, erst dann ist der DOM-Baum vollständig und korrekt.

          - Sven Rautenberg

          --
          "Love your nation - respect the others."
          1. Es gibt keinen Standard, der definiert, wie das DOM des Dokuments sich verhalten soll, während das Dokument noch geladen wird, ...

            Gibt es einen Browser wo du nicht auf Elemente zugreifen kannst obwohl das Dokument noch nicht geladen wurde?
            Ich kenne keinen, insofern funktioniert es, auch wenn es nicht definiert wurde.

            Struppi.

            1. Grütze .. äh ... Grüße!

              Es gibt keinen Standard, der definiert, wie das DOM des Dokuments sich verhalten soll, während das Dokument noch geladen wird, ...

              Gibt es einen Browser wo du nicht auf Elemente zugreifen kannst obwohl das Dokument noch nicht geladen wurde?
              Ich kenne keinen, insofern funktioniert es, auch wenn es nicht definiert wurde.

              Ich glaube, ich habe gerade ein Déjà-vu ff :-D


              Kai

              --
              What is the difference between Scientology and Microsoft? One is an
              evil cult bent on world domination and the other was begun by L. Ron
              Hubbard.
              ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|
              1. Ich glaube, ich habe gerade ein Déjà-vu ff :-D

                Ich auch, nur ist Sven wesentlich sympathischer als Thomas.

                Struppi.

                1. Grütze .. äh ... Grüße!

                  Ich glaube, ich habe gerade ein Déjà-vu ff :-D

                  Ich auch, nur ist Sven wesentlich sympathischer als Thomas.

                  Dito. In clj bekommt Thomas jedenfalls oft ordentlich Contra ;)


                  Kai

                  --
                  What is the difference between Scientology and Microsoft? One is an
                  evil cult bent on world domination and the other was begun by L. Ron
                  Hubbard.
                  ie:{ fl:( br:< va:) ls:? fo:| rl:? n4:° ss:{ de:] js:| ch:? mo:| zu:|
            2. Moin!

              Es gibt keinen Standard, der definiert, wie das DOM des Dokuments sich verhalten soll, während das Dokument noch geladen wird, ...

              Gibt es einen Browser wo du nicht auf Elemente zugreifen kannst obwohl das Dokument noch nicht geladen wurde?

              Diese Aussage stammt aus einem Vortrag eines Google-JS-Entwicklers - die Jungs werden sicherlich mit deutlich mehr Browserversionen und Unterversionen Kontakt haben, damit ihre JS-Libs funktionieren, als irgendeiner hier im Forum.

              Die Tatsache, dass es in vielen Browsern funktioniert, beweist also nicht, dass es in ALLEN Browsern funktioniert.

              Ich kenne keinen, insofern funktioniert es, auch wenn es nicht definiert wurde.

              Du kennst ALLE Browser?

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Hi

                Diese Aussage stammt aus einem Vortrag eines Google-JS-Entwicklers - die Jungs werden sicherlich mit deutlich mehr Browserversionen und Unterversionen Kontakt haben, damit ihre JS-Libs funktionieren, als irgendeiner hier im Forum.

                Die Tatsache, dass es in vielen Browsern funktioniert, beweist also nicht, dass es in ALLEN Browsern funktioniert.

                Da geb ich dir recht, aber Google ist auch schon lange kein startup mehr das ohne bürokratische Regelungen auskommt, wie "haltet euch nur an definierte Standards".

                Auch kenne ich (leider immernoch ) verbreitete Browserversionen in denen Googlemail abkackt.

                Ich persönlich würde bei der Anforderung einen Includepfad haben zu wollen, explizit ein include.js Modul schreiben, das den Rest durch dynamische Einbindung erledigt.

                <script src="include.js">
                <script>
                  include(PfadHauptscript1);
                  include(PfadHauptscript2);
                  ...
                </script>

                wenn sich bei bestimmten Browsern Probleme ergeben braucht man nur include.js upzudaten.

                Das ist IMHO deutlich sauberer als im DOM rumzusuchen.

                Du kennst ALLE Browser?

                Muss ich mich jetzt auch fragen, aber dynamische Einbindung hat lange vor DOM bereits im NS4 als auch in IE5.0 (IE4???) funktioniert, was zumindest einen "faktischen Standard" ergibt.

                "Dynamische Einbindung" könnte mittlerweile auch schriftlich fixierter Standard sein , oder?

                Bye
                 Kurt

              2. Es gibt keinen Standard, der definiert, wie das DOM des Dokuments sich verhalten soll, während das Dokument noch geladen wird, ...

                Gibt es einen Browser wo du nicht auf Elemente zugreifen kannst obwohl das Dokument noch nicht geladen wurde?

                Diese Aussage stammt aus einem Vortrag eines Google-JS-Entwicklers - die Jungs werden sicherlich mit deutlich mehr Browserversionen und Unterversionen Kontakt haben, damit ihre JS-Libs funktionieren, als irgendeiner hier im Forum.

                Die Aussage ist halt wage und ich mein Motto ist, was nicht verboten ist, ist erlaubt.

                Die Tatsache, dass es in vielen Browsern funktioniert, beweist also nicht, dass es in ALLEN Browsern funktioniert.

                Gut, aber wo steht das es nicht funktioniert?
                Der Punkt ist, das durchaus die Notwendigkeit besteht auf Elemente zu zugreifen bevor ein Dokument inkl. aller Bilder fertig geladen ist und da diese Verfaheen funktioniert spricht für mich nichts dagegen.

                Ich kenne keinen, insofern funktioniert es, auch wenn es nicht definiert wurde.

                Du kennst ALLE Browser?

                Bisher hat mir noch niemand einen nennen können, wo es nicht funktioniert.
                Und wenn z.b. so beliebte libs wie die von Walter Zorn seit Jahren auf diese Technik aufbauen, denke ich, gibt es keine Probleme sie zu nutzen.

                Struppi.

  3. Hallo Kurt,

    mit folgender Konstruktion ermittle ich den Pfad zu einer JS-Datei, um weitere Ressourcen aus dem selben Ordner nachzuladen. Der Name des Scriptes muss dazu bekannt sein.

      
      var Script_Path="";  
      var scr = document.getElementsByTagName("script");  
      for(var i=0;i<scr.length;i++) if(scr[i].src && scr[i].src.length) {  
        var path = scr[i].src;  
        var pos = path.search("Name_des_Scriptes_ohne_Pfad.js");  
        if(pos!=-1) {  
          Script_Path = path.substring(0,pos);  
          break;  
        }  
      }  
    
    

    Gruß, Jürgen

  4. Hallo Kurt, Kai und Jürgen,

    damit ich nicht dumm sterbe... welchen Vorteil hat es den
    Pfad des aktuellen Skriptes zu kennen ???

    Grüße
     Kurt Z

    1. Hallo Kurt,

      damit ich nicht dumm sterbe... welchen Vorteil hat es den
      Pfad des aktuellen Skriptes zu kennen ???

      wie ich schon geschrieben habe: mein Script benötigt Bilder, die im selben Ordner liegen wie das Script selbst. Der Pfad zum Ordner muss aber nicht bekannt sein und ist es auch nicht, da ich das Script anderen zum Download anbiete. Ebenso könnte man so weitere Scripte bei Bedarf nachladen.

      Gruß, Jürgen

      1. Hallo Jürgen,

        damit ich nicht dumm sterbe... welchen Vorteil hat es den
        Pfad des aktuellen Skriptes zu kennen ???

        wie ich schon geschrieben habe: mein Script benötigt Bilder, die im selben Ordner liegen wie das Script selbst.

        Ok hab ich überlesen...

        Der Pfad zum Ordner muss aber nicht bekannt sein und ist es auch nicht, da ich das Script anderen zum Download anbiete. Ebenso könnte man so weitere Scripte bei Bedarf nachladen.

        ja siehste das dynamische Laden zur Einbindung wär m.E. eine deutlich sauberere Lösung als im DOM rumzufischen und den Scriptnamen dafür festeinzucoden:

        sowas (ungetestet)

        <script>
        var Path="...";
        document.write('<scr'+'ipt src="'+Path+'">');
        </script>

        Bye
         Kurt

        Gruß, Jürgen

        1. Hallo Kurt,

          <script>
          var Path="...";
          document.write('<scr'+'ipt src="'+Path+'">');
          </script>

          da sehe ich zwei Möglichkeiten:

          1. Der Ersteller der Seite weiß, welche Scripte benötigt werden und wo sie abgelegt sind. Dann kann er sie alle in der ihm bekannten richtigen Reihenfolge per <script src=... einbinden.

          2. Der Seitenersteller weiß dieses nicht und kann evtl. auch gar kein Javascript. Er legt dann alle benötigten Scripte und weiteren Dateien in einen Ordner seiner Wahl (dieses kann auch per Unzip geschehen) und bindet dann nach Anleitung das "Hauptscript" ein. Dieses kümmert sich dann um den Rest.

          Gruß, Jürgen

          1. Hallo Jürgen

            1. Der Seitenersteller weiß dieses nicht und kann evtl. auch gar kein Javascript. Er legt dann alle benötigten Scripte und weiteren Dateien in einen Ordner seiner Wahl (dieses kann auch per Unzip geschehen) und bindet dann nach Anleitung das "Hauptscript" ein. Dieses kümmert sich dann um den Rest.

            eben, er muss nur das Hauptscript wie folgt einbinden

            <script>
            var Path=".../Hauptscript.js";
            document.write('<scr'+'ipt src="'+Path+'">');
            </script>

            dann weiß das Hauptscripte (oder die weiteren jeweiligen "Hauptscripte") immer in "Path" wo was liegt.

            und Fall 1 wird auch einfacher zu maintainen. Und der Name des Scriptes muss nicht im Script fest eingecoded werden.

            (abgesehen davon dass es wie erwähnt das jeweils letzte element bei getElementsByTagName("script"); ist)

            Bye
             Kurt

            1. Moin!

              (abgesehen davon dass es wie erwähnt das jeweils letzte element bei getElementsByTagName("script"); ist)

              Die Frage wäre doch: Könnte man es provozieren, dass dies nicht der Fall ist? Und zwar mit standardkonformen Mitteln?

              Mein Antwortvorschlag: Ja, kann man. Wenn das fragliche Script mit gesetztem Attribut "defer" nicht sofort ausgeführt wird, danach aber noch weitere Skripte eingebunden sind, würde sich die Ausführungszeit verschieben, und das Resultat von getElementsByTagName wäre ein anderes.

              - Sven Rautenberg

              --
              "Love your nation - respect the others."
              1. Hi

                (abgesehen davon dass es wie erwähnt das jeweils letzte element bei getElementsByTagName("script"); ist)

                Die Frage wäre doch: Könnte man es provozieren, dass dies nicht der Fall ist? Und zwar mit standardkonformen Mitteln?

                Mein Antwortvorschlag: Ja, kann man. Wenn das fragliche Script mit gesetztem Attribut "defer" nicht sofort ausgeführt wird, danach aber noch weitere Skripte eingebunden sind, würde sich die Ausführungszeit verschieben, und das Resultat von getElementsByTagName wäre ein anderes.

                Danke dass du mich mal wieder an defer erinnerst! (verdrängt :)
                Aber das ist ein bisserl konstruiert, die scripte sollen auf eine bestimmte art und weise eingebunden werden, ohne defer, basta.

                Wer defer braucht muss sich dann darauf verlassen, dass die eingebundenen Scripte chronologisch ausgeführt werden und die Liste mit einem Zähler abarbeiten.

                Das ist aber wieder ein gutes Argument mehr für das Include-Modul, welches ich vorschlug, das könnte auch den defer-SonderFall händeln.

                Eine exportierte Methode Include.getPath() würde transparent die Fälle in allen eingebundenen Scripten abhandeln.

                Versionscheck, Testsuiten, usw. wären auch denkbar...

                Aber müsig zu diskutieren, ich bin ziemlich sicher dass es sowas eh schon gibt, hatte vorgestern in der Buchhandlung im "Rhino"-Buch von Flanagan geblättert da  war auch von Modulen mit JS die Rede.

                Hier gibts auch bestimmt schon dergleichen http://openjsan.org/

                Bye
                 KurtZ