Cheatah: In ausgelagerter JS-Ressource dessen URL herausfinden

Hi,

ich befinde mich in einer per <script src> eingebundenen JavaScript-Ressource und möchte ermitteln, wie "meine" URL ist - also die des Scripts. Ich weiß, dass die Einbindung im <head> eines HTML-Dokuments geschehen ist, aber sehr viel mehr ist mir nicht bekannt.

Mein erster Ansatz war, das lastChild des <head>-Elements zu ermitteln und dessen src-Attribut mit dem location.href des Dokuments zu kombinieren[1]. Das funktioniert soweit auch ganz gut - sofern ich mich auf halbwegs aktuelle Browser beschränken kann. Ein Opera 7.54 lieferte aber leider ein <meta>-Element, welches drei Elemente vorher im Code steht. Bin begeistert[tm].

Den zweiten Ansatz hatte ich wegen des IE eigentlich schon vorher ausgeschlossen: Per try/catch habe ich einen Fehler forciert und das Error-Objekt analysiert. Gecko liefert mir auch brav eine sinnbehaftete fileName-Eigenschaft[2], aber der IE ... nun, wir kennen seine Fehlermeldungen. Opera 7.54 liefert mir die URL in der message-Eigenschaft - ist das Zufall oder Absicht? Falls letzteres, kann ich die beiden Ansätze _sicher_ kombinieren? Oder anders gefragt: Wie erfahre ich, ob der Browser das richtige Element liefert?

Natürlich wäre es mir am liebsten, wenn es einen direkteren Weg zur URL gäbe. Ich habe keinen gefunden - 'this' ist das Fenster, und andere Objekte lieferten mir auch keine Idee. Hat jemand das Problem schon einmal erfolgreich gelöst und/oder kann mir einen Schubs in die richtige Richtung geben?

Cheatah

[1] Für diese Verschmelzung zweier URIs gibt es ganz sicher bereits ausgetestete Bibliotheken. Da ich eh gerade poste: Kann mir jemand eine empfehlen?
[2] Sofern der Fehler über "hilfedalaeufteinemausueberdietastatur()" geschieht. Bei "throw new Error()" steckt der Filename im Stack an zweiter Stelle, während der erste Eintrag die URL des HTML-Dokuments mit Zeilennummer 0 ist. Wer mir verraten kann, warum dem so ist, kann sämtliche Tippfehler behalten, die sich in diesem Posting befinden. Zum Beispiel deise heir.

--
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. Mist,

    gucken will gelernt sein.

    Per try/catch habe ich einen Fehler forciert und das Error-Objekt analysiert. [...] Opera 7.54 liefert mir die URL in der message-Eigenschaft

    Es ist die URL des Dokuments, nicht die der JavaScript-Ressource. Damit ist das Problem für mich wieder ein Stückchen schwerwiegender geworden.

    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
  2. Hallo Cheatah,

    Ich habe das hier gerade aus einen meiner Scripte kopiert:

    function getPicPath()
      {

    var allScripts = document.getElementsByTagName("script");
        for(var i = 0; i < allScripts.length; i++)
        {
          if(allScripts[i].src && allScripts[i].src.lastIndexOf("elb.js") > -1)
          {
            return allScripts[i].src.replace("elb.js", "pics/");
          }
        }
        return false;
      }

    Es stammt aus dem Script zu http://dieterraber.net/twElb.htm. Inwiefern das in allen Browser dieser welt funktioniert, weiss ich nicht, aber vielleicht bringt es dich ja weiter.

    Gruß,

    Dieter

    1. Hi,

      Ich habe das hier gerade aus einen meiner Scripte kopiert:

      danke, und siehe bitte meine Antwort auf desletztenkicks Posting. Im Prinzip war ich mit headElement.lastChild bereits an der gleichen Stelle (abgesehen davon, dass Dein Script natürlich robuster ist, da es auch außerhalb des <head> funktioniert, aber das ist für meinen Fall nicht bedeutend), nur ist dieses Verfahren leider nicht browserübergreifend genug.

      Inwiefern das in allen Browser dieser welt funktioniert, weiss ich nicht, aber vielleicht bringt es dich ja weiter.

      Nun ja, es bestätigt meinen Ansatz ;-)

      The quest goes on ...

      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
  3. Hallo Cheatah,

    Hi,

    ich befinde mich in einer per <script src> eingebundenen JavaScript-Ressource und möchte ermitteln, wie "meine" URL ist - also die des Scripts.

    Ich muss es falsch verstanden haben, zumindest erscheint mir meine Lösung zu trivial für Dich ;)

      
    window.onload = function(){  
     var js = document.getElementsByTagName("script");  
     for (var i=0; i<js.length; i++){  
      alert(js[i].src);  
     }  
    };
    

    So würdest Du alle eingebundenen Scripte bekommen. Inlinescripte sind nun nicht berücksichtigt und auch die Stelle (zw. den HEAD-Tags) könnte noch zur weiteren Eingrenzung heranziehen, über this.location.hostname könnte man weiter eingrenzen.

    So, nun klär mich mal auf, was ich falsch verstanden habe an Deinem Posting :)

    Mit freundlichem Gruß
    Micha

    --
    LeagueEditor JavaScript kostenlose Ligaverwaltung || richtig Messen will gelernt sein
    1. Hi,

      ich befinde mich in einer per <script src> eingebundenen JavaScript-Ressource und möchte ermitteln, wie "meine" URL ist - also die des Scripts.
      Ich muss es falsch verstanden haben, zumindest erscheint mir meine Lösung zu trivial für Dich ;)

      jupp ;-)

      window.onload = function(){
      var js = document.getElementsByTagName("script");
      for (var i=0; i<js.length; i++){
        alert(js[i].src);

        
      if (js[i].src != currentScript.src) { previousAlert.ignore(); } // [1]  
        
      ;-)  
        
      Mich interessieren nicht die Attribute irgendwelcher dahergelaufener <script>-Elemente im Dokument, sondern genau die URL genau des einen Scripts welches genau jetzt läuft, in diesem Moment. Also das, was  
        
      ~~~html
      <script type="text/javascript">  
      alert(location.href);  
      </script>
      

      für das aktuelle Dokument ist, möchte ich *in* einem

      <script type="text/javascript" src="foobar.js"></script>

      *über* eben dieses foobar.js erfahren. Im Idealfall gibt es also ein getCurrentUri(), welches mit http://example.com/path/to/foobar.js liefert.

      So würdest Du alle eingebundenen Scripte bekommen.

      Jau, davon interessiert mich aber nur eines - und welches das ist, muss ich genauso raten, wie ich (s. Opera 7.54) hoffen muss, dass es überhaupt dabei ist.

      Inlinescripte sind nun nicht berücksichtigt

      Deren URL kenne ich ja auch ;-)

      Cheatah

      [1] Heia, das sieht aus wie 'ne Bauanleitung von Ikea *g*

      --
      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. Hallo Cheatah,

        sondern genau die URL genau des einen Scripts welches genau jetzt läuft, in diesem Moment

        2. Versuch: Du möchtest während das Script läuft wissen, wie dessen src-Attribut ist?

          
         var js = document.getElementsByTagName("html")[0].getElementsByTagName("script");  
         alert(js[js.length-1].src);
        

        Wenn sich das Script selbst aufruft (nicht mehr über onload()), kennt es alle Script-Tags, die es vor ihm gab und natürlich sich selbst. Folglich ist es das letzte im array.

        Ich fürchte aber, dass ich Dich wieder nicht vom Hocker reißen kann ;-)

        Mit freundlichem Gruß
        Micha

        --
        LeagueEditor JavaScript kostenlose Ligaverwaltung || richtig Messen will gelernt sein
        1. Hi,

          Ich fürchte aber, dass ich Dich wieder nicht vom Hocker reißen kann ;-)

          leider nicht :-) denn es ist nicht besonders weit von meinem Versuch mit lastChild entfernt. Es befriedigt mich zudem wenig, mich auf Begebenheiten im HTML-Dokument verlassen zu müssen. Man denke nur an den IE, der dynamisch erzeugte <script>-Elemente nicht synchron handhaben kann ... (Nun ja, ich könnte mich dazu bewegen, dies als Use-Case abzuerkennen, aber das ungute Gefühl bleibt trotzdem.)

          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. Hallo Cheatah,

            Es befriedigt mich zudem wenig, mich auf Begebenheiten im HTML-Dokument verlassen zu müssen.

            Tust Du das nicht auch, wenn Du mit lastChild etwas erreichen möchtest?

            Mit freundlichem Gruß
            Micha

            --
            LeagueEditor JavaScript kostenlose Ligaverwaltung || richtig Messen will gelernt sein
            1. Versteh ich das richtig, dass du aus irgend nem X-beliebigen Script bspw. eine Funktion schreiben willst, die dir die Location des aufrufenden HTMLs liefern soll?

              Wenn ja, warum sollte nicht ganz normal window.location.href funktionieren?

              Gruß shi :)

              1. Hi,

                Versteh ich das richtig, dass du aus irgend nem X-beliebigen Script bspw. eine Funktion schreiben willst, die dir die Location des aufrufenden HTMLs liefern soll?

                nein, die des aufgerufenen Scripts.

                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
            2. Hi,

              Es befriedigt mich zudem wenig, mich auf Begebenheiten im HTML-Dokument verlassen zu müssen.
              Tust Du das nicht auch, wenn Du mit lastChild etwas erreichen möchtest?

              ja. Ich habe aber nie gesagt, dass ich das toll finde *g*

              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. Hallo Cheatah,

                ohne es probiert zu haben, wäre ein getElementsBy("*") dann nicht möglich? Das Script sollte in diesem Augenblick ja immer das letzte Elements ein:

                  
                var js = document.getElementsByTagName("*");  
                alert(js[js.length-1);  
                
                

                Hierbei solltest Du doch unabhängig von der Struktur des HTML-Dokumentes sein und musst Dich nicht auf /irgendwas/ verlassen.

                Schöne Grüße
                Micha

                --
                LeagueEditor JavaScript kostenlose Ligaverwaltung || richtig Messen will gelernt sein
                1. Hi,

                  ohne es probiert zu haben, wäre ein getElementsBy("*") dann nicht möglich?

                  das ist auch wieder nur ein anderer Name für das selbe Problem. Ich finde bei Opera 7 einfach nicht die Elemente. Der Browser scheint in der JavaScript-Verarbeitung schon weiter zu sein als bei der DOM-Erzeugung.

                  Das Script sollte in diesem Augenblick ja immer das letzte Elements ein:

                  • '*' liefert mir genau mehrere Elemente, in nur teilweise der richtigen Reihenfolge.
                  • 'script' liefert mir zwar etwas, aber leider nicht das Richtige.
                  • 'head' liefert mir auch etwas. Unter den Kindern sind keine <script>-Elemente.
                  • Was auch logisch ist, da das gefundene <script>-Element als Vater das <html>-Element hat.
                  • Die Kinder von <html> sind wieder zahlreich und nicht so, wie ich es vermuten würde. Die Reihenfolge stimmt nicht. Interessanterweise ordnet Opera offenbar alle <link>- und <script>-Elemente sowie Kommentare, die im <head> stehen, direkt unterhalb von <html> ein - auf eine Weise, der ich im Moment noch kein System entnehmen kann.

                  Vielleicht sollte ich mir mal die Mühe machen, einen minimalen Testfall runterzudampfen und ihn schrittweise zu erweitern, bis ich ein System erkenne, das ich nutzen kann. Blöd nur, dass das Problem innerhalb eines komplexen Frameworks auftritt :-/

                  Hierbei solltest Du doch unabhängig von der Struktur des HTML-Dokumentes sein und musst Dich nicht auf /irgendwas/ verlassen.

                  Ich bin in der glücklichen Lage, über gewisse Dinge uneingeschränkte Befehlsgewalt zu besitzen ;-)

                  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. Hallo Cheatah,

                    die genannten Probleme sind nur noch in Opera 7 oder mißverstehe ich Dein letztes Posting? Dieser steht mir nicht mher zur Verfügung...

                    Ich bin in der glücklichen Lage, über gewisse Dinge uneingeschränkte Befehlsgewalt zu besitzen ;-)

                    Das wiederspricht sich irgendwie mit dem, was Du eigentlich suchst. Mal kannst Du Dich auf gewisse Dinge nicht "verlassen" und nun beschreibst Du einen gegenteilige Situation - man hat es schon nicht leicht mit Dir ;-)

                    Letztlich hätte es mich auch gewundert, wenn ich Dir einen Tipp hätte geben können. Trotzdem viel Erfolg bei der Suche bzw. Lösung!

                    Mit freundlichem Gruß
                    Micha

                    --
                    LeagueEditor JavaScript kostenlose Ligaverwaltung || richtig Messen will gelernt sein
                  2. Hi,

                    • 'head' liefert mir auch etwas. Unter den Kindern sind keine <script>-Elemente.
                    • Was auch logisch ist, da das gefundene <script>-Element als Vater das <html>-Element hat.

                    Wie bitte? Dein script-Element ist Kind des html-Elements?
                    Das hieße ja, daß Du invaliden Code baust. Eine Welt bricht zusammen ...

                    Was mir noch einfällt:

                    1. platziere in Deiner Script-Resource einen weltweit einmaligen String (z.B. als Kommentar)
                    2. suche nach allen Script-Elementen mit src-Attribut.
                    3. fordere diese der Reihe nach per XMLHttpRequest an, suche im responseText nach Deinem weltweit einmaligen String.
                    (wegen XMLHttpRequest kommt das aber wohl nicht in Frage, Du versuchst ja, Uralt-Browser wie Opera 7.x zu unterstützen ...)

                    Ersatzweise:

                    erzeuge die Script-Resource dynamisch (PHP, SSI, ...) und laß dabei die eigene URL mit reinsetzen (z.B. in ein var = "<?php echo $url; ?>";)

                    Ersatz-Ersatzweise:
                    schreib in die install-Anweisung, daß der Installateur die Variable setzen muß.

                    cu,
                    Andreas

                    --
                    Warum nennt sich Andreas hier MudGuard?
                    Schreinerei Waechter
                    O o ostern ...
                    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
                    1. hi,

                      1. suche nach allen Script-Elementen mit src-Attribut.
                      2. fordere diese der Reihe nach per XMLHttpRequest an, suche im responseText nach Deinem weltweit einmaligen String.

                      Wir reden doch von Scripten, die von fremden Domains eingebunden werden - wie willst du die an der same origin policy vorbei per XMLHTTPRequest anfordern?

                      Oder habe ich dich missverstanden?

                      gruß,
                      wahsaga

                      --
                      /voodoo.css:
                      #GeorgeWBush { position:absolute; bottom:-6ft; }
  4. hi Cheatah,

    darf man dich denn in guter SELFFORUMs-Manier bitten, mal zu erläutern, was du denn eigentlich _vorhast_, damit man dir eventuell Alternativvorschläge unterbreiten könnte ...?
    (Auch wenn ich in diesem Falle nicht wirklich glaube, dass es zielführende geben wird.)

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo wahsaga!

      darf man dich denn in guter SELFFORUMs-Manier bitten, mal zu erläutern, was du denn eigentlich _vorhast_, damit man dir eventuell Alternativvorschläge unterbreiten könnte ...?

      ;)

      Mein Weltbild ist zerbrochen: Cheatah hat im SELFHTML Forum eine Frage gestellt... Der Weltuntergang, nichts steht mehr auf seinem Platz! Was wird aus uns?

      Ach Du dickes ;)

      Viele Grüße aus Frankfurt/Main,
      Patrick

      --

      _ - jenseits vom delirium - _
      1. Hi,

        Mein Weltbild ist zerbrochen: Cheatah hat im SELFHTML Forum eine Frage gestellt...

        soll ich Dich mal schocken? Das ist nicht das erste Mal! ;-)

        Der Weltuntergang, nichts steht mehr auf seinem Platz! Was wird aus uns?

        "Alles was wir sind ist Staub im Wind, Hoschi."
        -- Ted (oder war's Bill?)

        Ach Du dickes ;)

        Aye, Sir! :-)

        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
    2. Hi,

      darf man dich denn in guter SELFFORUMs-Manier bitten, mal zu erläutern, was du denn eigentlich _vorhast_, damit man dir eventuell Alternativvorschläge unterbreiten könnte ...?

      ich möchte dynamisch JavaScript-Ressourcen nachladen, die sich an der selben Stelle befinden wie das nachladende Script, welches lediglich nicht weiß, wo diese Stelle ist.

      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
  5. Hallo Cheatah,

    vieleicht verstehe ich Dein Problem ja nicht richtig, aber wenn es Dein Script ist, das da eingefügt wird, dann kennst Du doch den Namen und kannst ihn als Variable im Script ablegen.

    Gruß, Jürgen

    1. Hi,

      vieleicht verstehe ich Dein Problem ja nicht richtig, aber wenn es Dein Script ist, das da eingefügt wird, dann kennst Du doch den Namen und kannst ihn als Variable im Script ablegen.

      den Namen schon, aber nicht die URL :-)

      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. Hallo,

        vieleicht verstehe ich Dein Problem ja nicht richtig, aber wenn es Dein Script ist, das da eingefügt wird, dann kennst Du doch den Namen und kannst ihn als Variable im Script ablegen.
        den Namen schon, aber nicht die URL :-)

        Mit Hilfe des Namens der Datei kannst Du aber leicht alle Script-src durchlaufen und die mit passendem Namen auswählen um den zu Pfad extrahieren. Vorausgesetzt natürlich, dass die Namen eindeutig sind.

        Ciao

        1. Hi there,

          Mit Hilfe des Namens der Datei kannst Du aber leicht alle Script-src durchlaufen und die mit passendem Namen auswählen um den zu Pfad extrahieren. Vorausgesetzt natürlich, dass die Namen eindeutig sind.

          Das ist aber eine wichtige Einschränkung, die Deine Lösung unbrauchbar macht. Denkbar wäre eine Situation, wo in verschiedenen Verzeichnissen gleichlautende js-Dateien liegen, was machst Du dann? Ich schätze einmal, daß er eine maximal allgemeine Lösung sucht, und da fällt raten und hoffen auf möglichst verschiedene Dateinamen eher nicht darunter...

        2. Hi,

          Mit Hilfe des Namens der Datei kannst Du aber leicht alle Script-src durchlaufen und die mit passendem Namen auswählen um den zu Pfad extrahieren.

          sicher. Sofern die <script>-Elemente _überhaupt_ schon im DOM-Baum sind ...

          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
  6. Hallo Cheatah,

    ich befinde mich in einer per <script src> eingebundenen JavaScript-Ressource und möchte ermitteln, wie "meine" URL ist - also die des Scripts.

    Hm? Du weißt doch, wo das Script liegt, oder?

    var uri = "http://example.org/webzweinulloverhead.js";  
      
    // … am URI herumnesteln
    

    Grüße
     Roland