Parameter an externe JS-Datei übergeben

Moritz123

Erfahrenes Mitglied
Hallo allerseits,

ich arbeite zur Zeit an einem Tool, mit dem sich "Widgets" erstellen lassen. Ergebnis des Erstellens soll eine Javascript-Datei sein, die der Benutzer dann in seiner Seite einbinden kann.
Ich müsste allerdings ein paar Werte an diese JS-Datei übergeben, um Einstellungen vornehmen zu können.
Ist folgendes möglich:
HTML:
<script type="text/javascript" src=test.js?parameter1=xy"></script>
Wie kann ich dann innerhalb der Javascript-Datei auf den Parameter "parameter1" zugreifen?

Vielen Dank!
 
Moin Moritz,

das eingebundene JS-File stellt ja aus DOM-Sicht ein Element wie jedes andere dar.
Als Solches kannst du auf seine Attribute (also src in dem Fall) zugreifen, und aus der ermittelten URL mit String-Methoden die gewünschten Infos extrahieren.
Am besten gibst du dem <script> eine ID und greifst anhand dieser darauf zu, das erspart dir umständliches Gewurschtel, um das richtige <script> aus dem Dokument zu Fischen....du solltest da aber optimalerweise in der Dokumentation darauf hinweisen, dass diese ID bitte für das Skript reserviert ist :)
 
Hallo Sven,

vielen Dank für deine Antwort. Wenn ich sie richtig verstanden habe, bin ich mir nicht sicher, ob sie mein Problem lösen:
Ich möchte ja innerhalb der test.js auf den Parameter 'parameter1' zugreifen. Ein weiteres Problem, welches sich heute morgen ergeben hat,
ist, dass unter Umständen eine weitere Anzahl unbekannter Parameter hinzukommen können, weswegen das Parsen der URL denke ich die
bequemste und flexibelste Variante darstellt. Könntest Du mir evtl ein Beispiel für deinen Lösungsansatz geben?

Ich habe zwischenzeitlich überlegt, den Code wie folgt auszuliefern:
HTML:
<script type="text/javascript">var param1 = "TEST!";</script>
<script type="text/javascript" src=test.js"></script>
Und dann in der test.js einfach auf die Variable 'param1' zuzugeifen.
 
Hi,

Svens Antwort löst dein Problem.

Eine mögliche Implementierung könnte wie folgt aussehen:

test.js
Code:
// Bisherige onload-Funktionalität
var fnLoad = window.onload;

window.onload = function(){
  // Bisherige onload-Funktionalität aufrufen
  fnLoad();

  // Script ermitteln
  var objScript = document.getElementById("script_id");
  var strSrc = objScript.src;
  strSrc = strSrc.substring(strSrc.indexOf("?")+1, strSrc.length);

  // Parameter splitten
  var arrHlp = strSrc.split("&");
  var GET = [];

  // Parameter durchlaufen
  for(var strEntry in arrHlp){
    // Parameter in Name und Wert splitten und in GET-Array schreiben
    var arrH = arrHlp[strEntry].split("=");
    GET[arrH[0]] = arrH[1];
  }

  // TEST: Ausgabe des GET-Arrays
  var strOut = "";
  for(var strEntry in GET){
    strOut += "GET['"+strEntry+"'] = " + GET[strEntry] + "\n";
  }
  alert(strOut);
}

Der Scripttag wird wie gewohnt ins Dokument eingebunden und - wie bereits von Sven erwähnt - mit einer ID versehen (hier: script_id).
Code:
<script id="script_id" src="test.js?param1=p1&param2=p2" type="text/javascript"></script>

Ciao
Quaese
 
Ist übrigens nicht meine Idee :)

Ich weiss nur, das bei scriptaculous ähnlich verfahren wird beim Laden der benötigten Bibliotheken, und hab gestern mal nachgeschaut, was sie da genau machen.
Dass es sich um ein simples parsen der URL handelt, hatte mich dabei allerdings etwas enttäuscht, ich hatte gehofft, ein Wunderelexier zu Finden :suspekt:

Wie man es angehen kann, hat ja Quaese schon geschrieben, aber noch eine Anmerkung zu deiner Idee mit der Variablen.
Ich würde davon abraten.
Sobald du mit deiner Sache globale Variablen verwendest, sind Probleme garantiert.

Du kannst nie wissen, was für Skripte der Nutzer noch verwendet.
Mein Vorschlag daher: deine eigene Anwendung konzipiere von Anfang an als ein einziges Objekt, und das mit möglichst variablem Instanznamen.

So gehst du Kompatibilitätsproblemen aus dem Weg, weil alles, was über dies Objekt läuft, von anderen Skripten auf der Seite nicht zufällig/ungewollt beeinflusst wird(und umgekehrt). Der variable Name für dies Objekt ermöglicht dem Nutzer, falls es doch mal zu Namenskonflikten kommen sollte, durch eine kleine Änderung diesen Zustand zu Ändern.

jQuery macht das zum Beispiel so.
 
@Sven:
[WORTKLAUBEREI]
Aber deine Antwort hat zur Lösung beigetragen, weil ich sie bei der Lösung als Grundlage genommen habe ;-)
[/WORTKLAUBEREI]

Ciao
Quaese
 
Zurück