"register_once" in Javascript?
Michael Nagler
- javascript
0 Bio0 Sven Rautenberg
Hallo,
Ich habe hier ein Projekt in PHP, welches HTML-Seiten inkl. Javascript generiert. Dabei werden Javascript-Tags erzeugt, die externe Javascript-Sourcen nachladen, also z.B.:
<script type="text/javascript" src="script.js"></script>
Das Problem ist nun, dass unter Umständen der selbe Tag zweimal erzeugt wird (lässt sich aber im PHP Projekt nicht so leicht ändern). Also steht dann im HTML-Quelltext zweimal <script type="text/javascript" src="script.js"></script>. Daraufhin funktioniert das Script nicht mehr. Nun wollte ich wissen, ob ich in Javascript realisieren kann, dass das Script merkt, dass es schon geladen wurde. Also etwa so:
[Datei script.js]
if( !loaded["script.js"] )
{
function xyz()
{
// etc...
}
loaded["script.js"] = true;
}
Mit freundlichen Grüßen,
Michael Nagler
Sup!
Das Problem ist nun, dass unter Umständen der selbe Tag zweimal erzeugt wird (lässt sich aber im PHP Projekt nicht so leicht ändern). Also steht dann im HTML-Quelltext zweimal <script type="text/javascript" src="script.js"></script>.
Wie jetzt?
Skripte sollten genau einmal im <head> Bereich definiert werden - aber auch, wenn im Head zweimal das gleiche Skript eingebunden wird, funktioniert es in meinem Mozilla ganz gut - weniger gut funktioniert allerdings, wenn man <body onLoad="func()"> schreibt (und das Semikolon vergisst, dann haengt sich der Kram auf...).
Gruesse,
Bio
Moin!
Das Problem ist nun, dass unter Umständen der selbe Tag zweimal erzeugt wird (lässt sich aber im PHP Projekt nicht so leicht ändern).
Aber genau das solltest du tun. Denn es ist nun mal ein Fehler in deinem PHP, der mit der richtigen Programmierung vermieden worden wäre.
Klar: Javascript sieht man nicht, und wenn ein Javascript-Mechanismus die Dopplung verhindern könnte, wärst du rein technisch aus dem Schneider.
Aber wenn ich mir vorstelle, dass bei dir ungehindert Dopplungen vorkommen, dann erwarte ich vom Prinzip her auch doppelte Überschriften. "Sorry, die lassen sich nicht so leicht verhindern...." ist dann eine ziemlich schwache Ausrede. Nimmst du dafür dann CSS und display:none?
Noch schlimmer, wenn ich in einem Shop nur ein Produkt bestelle, aber zwei berechnet werden. "Sorry, das läßt sich...." Haha!
Benutzt du keine Template-Engine? Wäre mal eine echte Alternative? Der gibst du alle notwendigen Daten, die sie an die gewünschten Stellen in die Seite einbaut. Und wenn im Template genau eine Position für die Einbindung eines externen Javascripts definiert ist, dann kommt das auch nur einmal raus.
- Sven Rautenberg
Hallo,
Lol! Natürlich kommt das in dem System nur bedingt vor - und auch nur dann, wenn ein Bereich das gleiche Navigationsskript verwendet, wie ein anderer Bereich. Also kann es eigentlich höchstens zweimal vorkommen. Überschriften und andere Dinge sind davon nicht betroffen. Ich habe mir aber schon geholfen, indem ich die Mögliche Dopplung der Funktionsdefinitionen (bzw. das doppelte Interpretieren der Skripte) wie folgt verhindere:
[Datei script.js]
if( !myfunction )
{
function myfunction()
{
// etc...
}
}
Mit freundlichen Grüßen,
Michael Nagler
Hi,
if( !myfunction )
das ist schlecht, denn entweder ist myfunction definiert oder undefiniert. Undefiniert ist aber nicht boolsch false. Wenn schon:
if (typeof myfunction != "undefined")...
Aber auch ich wuerde mir eher einen PHP-Mechanismus ausdenken, um sowas auszuschliessen.
Gruesse Joachim
Moin!
Lol! Natürlich kommt das in dem System nur bedingt vor - und auch nur dann, wenn ein Bereich das gleiche Navigationsskript verwendet, wie ein anderer Bereich.
Dann würde ich an deiner Stelle das Javascript grundsätzlich immer einbinden - und es steht immer zur Verfügung, wenn es gebraucht wird, und wenn es nicht gebracht wird - egal.
Die Auswirkungen auf den Browser und User sind auch gering. Es wird einmal in den Cache geholt, und fertig.
- Sven Rautenberg