Verarbeitungsreihenfolge -> Problem/JS verzögert ausführen

StupidBoy

Mitglied Gold
Einen schönen Abend miteinander,

ich bin grade dabei, ein CMS auf dessen Quelltext ich keinen Zugriff habe (komme weder ans HTML-Markup noch an den PHP-Code ran), via JS/DOM und CSS etwas zu verschönern.
Soweit so gut, nun möchte ich einige HTML-Elemente unter Zuhilfenahme der entsprechenden Funktionen einfügen, das Problem jedoch ist, dass ich den JS-Code nur in ein JS-File schreiben kann das in die seite eingebunden wird, also im Head. Die gewünschten Elemente sollen aber per appendChild nach bestimmten anderen Elementen eingefügt werden. Diese anderen Elemente scheinen aber zu dem Zeitpunkt wenn das JS-Script ausgeführt wird offensichtlich noch gar nicht geladen zu sein, so dass das ganze recht erfolglos bleibt.
Nun dachte ich mir, ich könnte mittels JS respektive createTextNode evt. einfach einen weiteren Scriptbereich am Ende des Markups einfügen der dann den Code zum anfügen der Elemente enthält, das funktionierte aber auch nicht.

Nun bin ich etwas ratlos wie ich es schaffen könnte, dass der JS-Code erst dann verarbeitet wird, wenn der Rest der Seite geladen wurde.

Könte mir da jemand einen Tipp geben?
 
Hi,

hast Du schon versucht, das JS im onload-Event auszuführen? Dieser wird ausgeführt, wenn das
Dokument fertig geladen ist.
Code:
window.onload = function(){
  // Gewünschte Anweisungen
}
Vielleicht hilft Dir das weiter.

Ciao
Quaese
 
Leider hat auch das keine Erfolg gebracht.

Kann es sein, dass ein Statement wie das folgende generell nicht funktioniert wenn das Element oder der Textknoten nach dem Javascript steht?

Code:
var child 	= document.getElementById("main_navigation_menu").childNodes[1].childNodes[1].childNodes[0].nodeValue;
 
Die Position des Skriptcodes spielt keine Rolle, sofern beim onload auf die Knoten zugegriffen wird.

Vermutlich kommen dir Zeilenumbrüche inkl. Leerzeichen ins Gehege, diese gelten(je nach Browser) auch als Textknoten.

Versuche mal, falls möglich, per getElementsByTagName() auf die Kindknoten zuzugreifen...diese Methode kannst du nicht nur aufs Dokument, sondern auch auf Knoten anwenden...was ein genaueren Zugriff ermöglichen sollte.
 
Würden die Zeilenumbrüche etc. eine Rolle spielen, so würde mich das doch arg wundern, ich habe zwar festellen müssen, dass sich die Browser etwas unterschiedlich verhalten und zwei verschiedene Versionen geschrieben, eine für den IE, die andere für alle anderen Browser die ich auf meinem Win-System testen kann.
Es funktioniert ja auch alles wunderbar, sonlange ich den Code nicht oberhalb des zu editierenden Markups schreibe sonder irgendwo da unter.

Ich habs trotzdem noch mal mit einer etwas modofizierten Variante versucht, aber auch das ergab leider keinen Erfolg.

So gehts:
HTML:
[...]
<body>
[...]
<ul id="main_navigation_list">
<li><a>Some Content #1</a></li>
<li><a>Some Content #2</a></li>
<li><a>Some Content #3</a></li>
[...]
</ul>
[...]

<scripty type="text/javascript">
var nav = document.getElementById("main_navigation_list");
var val = nav.getElementsByTagName("a")[1].firstChild.nodeValue;
alert(val);
</script>
</body>
</html>

Und so leider nicht:
HTML:
[...]
<head>
[...]
<scripty type="text/javascript">
window.onload=function() {
var nav = document.getElementById("main_navigation_list");
var val = nav.getElementsByTagName("a")[1].firstChild.nodeValue;
alert(val);
}
</script>
</head>
<body>
[...]
<ul id="main_navigation_list">
<li><a>Some Content #1</a></li>
<li><a>Some Content #2</a></li>
<li><a>Some Content #3</a></li>
[...]
</ul>
[...]
</body>
</html>

PS: Einzig der Opera arbeitet hier im letzten Beispiel so wie ich mir das Vorstelle, selbst dann noch, wenn ich das ganze ohne window.onload mache.

PPS: Falls es relevant sein sollte, ich kann es mir eigentlich nicht vorstellen, aber man weiß ja nie, real ist es so, dass der Scriptcode im letzten Code-Schnipsel in einem externen JS-File liegt, da ich, wie anfangs bereits erwähnt, aufs Markup keinen Zugriff habe.
 
Hi,

wie sieht es aus, wenn Du den onload-Event nach dem Menü platzierst?

Vielleicht steht ja irgendwo weiter "unten" im Dokument nochmal eine weitere Zuweisung an den onload-Event. Dann würde nur noch diese ausgeführt werden.

Ciao
Quaese
 
Hehe, da haben wir ja das Problem, das Onload-Event bzw. den JS-Code kann ich nicht im Markup platzieren sondern nur in einer JS-Datei die ins Markup eingebunden wird da das Markup aus einer DB kommt auf die ich keinen zugriff habe.

Wie ich aber gerade sehe, steht im body-Tag des Markups tatsächlich noch ein onload, könnte das zu meinen Problemen führen?
 
Wie oben schon erwähnt, wenn der body-Tag mit dem onload-Event nach deinem Script folgt, werden
die Anweisungen, die du nach dem vollständigen Laden ausführen willst, nicht mehr beachtet.

Eins kannst du noch versuchen. Weise die Funktion, die bisher im onload des body ausgeführt wurde,
einer Variablen zu. Anschliessend definierst du die alte Funktion neu und rufst dort die gewünschten
Anweisungen auf. Zunächst wird die bisherige Funktion ausgeführt, dann deine Anweisungen.
Code:
<html>
<head>
<title>www.tutorials.de</title>
<meta name="author" content="Quaese">
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
<script type="text/javascript">
  <!--
function funcOnload(){ alert("Vorhandene Onload-Funktion");}

function theFunc(){ alert("Meine Onload-Funktion");}

// Bisherige onload-Funktion an Variable
var fxHelp = funcOnload;

// Bisherige onload-Funktion überschreiben
funcOnload = function(){
  // Zunächst bisherigen Code ausführen
  fxHelp();

  // Eigene Anweisungen aufrufen
  theFunc();
}
 //-->
</script>
</head>
<body onload="funcOnload();">
Der Inhalt
</body>
</html>

Ciao
Quaese
 

Neue Beiträge

Zurück