Event-Listener für dyn. generierte Element (AJAX) - IE Problem
dicon
- javascript
Moin community...
ich habe folgende Aufgabenstellung, bei deren Abarbeitung ich mich seit Tagen im Kreis drehe:
Ich bastel’ an einer Menüleiste deren Elemente (Klappmenüs) dynamisch generiert werden. Dazu
erzeuge ich via Mouseclick auf ein Menüelement zwei Dinge:
1. einen httpRequest auf eine PHP-Datei die den HTML-Code für das Klappmenü liefert und
2. ein DIV, welches ins DOM eingeklinkt wird und via obj.innerHTML den HTML-Code auf den Bild-
schirm bringt.
Beim Laden der Menüleiste registriere ich für die entsprechenden Elemente einen Event-Listener
für den OnClick-Event via window.onload(func); direkt aus der JS-Datei heraus.
Für die erste Ebene der Menüs ist alles ok - bedeutet alle Menüs klappen auf und zu, sowohl
in FF als auch im IE 6. Probleme gibt's im IE 6 bei der Event-Registrierung für die
Element im erzeugten DIV. Im IE 6 wird den Elementen offensichtlich kein Event zugewiesen in
FF schon.
Zum besseren Verständnis, und bevor ich die Sachen aufzähle, die ich schon durchprobiert habe,
ein paar Code-Snips (reduziert):
HTML-Code, den der httpRequest für Ebene 1 (Menüleiste) liefert (der Code für die Klapp-
menüs folgt demselben Prinzip).
============================== html ebene 1 snip begin ==============================
// ID der TD-Elemente basieren auf einer SQL-Abfrage, Mittelteil identisch da es sich um
// Elemente einer Gruppe handelt
2 <div id="toolbar" class="toolbar">
3 <table cellpadding="0" cellspacing="0">
4 <tbody>
5 <tr>
6 <td id="tool_126h67j8876h_1" class="tool_button_normal" height="16">Menüpunkt 1</td>
7 </tr>
8 <tr>
9 <td id="tool_126h67j8876h_2" class="tool_button_normal" height="16">Menüpunkt 2</td>
10 </tr>
...
<tr>
21 <td id="tool_126h67j8876h_X" class="tool_button_normal" height="16">Menüpunkt X</td>
22 </tr>
23 </tbody>
24 </table>
25 </div>
26 <script type="text/javascript">onPageLoad('126h67j8876h');</script>
=============================== html ebene 1 snip end ===============================
weiß nicht, ob das relevant ist, aber PHP liefert den Code in Form von
echo " <div id="toolbar" class="toolbar">\n";
und nicht als Variable
html .= "<div id="toolbar" class="toolbar">";
return html
Die Event-Registrierung erfolgt im Kern über folgende JS-Funktion (addEvent greift auf die
Cross-Browser Registrierung von Scott Andrew LePera zu):
=================================== js snip begin ===================================
1 onPageLoad = function(phpId){
2 var tdTool = document.getElementsByTagName('td'); // ermittelt alle TD-Elemente
3
4 for (var i = 0; i < tdTool.length; i++) { // Für alle TD-Elemente...
5 id = tdTool[i].id; // TD-Element-ID ermitteln...
6 mLev = getMenuLev(id); // an die Funktion getMenuLev übergeben...
7 mId = mLev.mId; // um Teil-String (Mittelteil der ID) zurückzubekommen.
8
9 if (mId == phpId) { // Wenn Teil-String mit Übergabeparameter übereinstimmt...
10 addEvent(tdTool[i], "click", evtShowMenu); // setze den EventListener auf dieses TD-Element.
11 addEvent(tdTool[i], "mouseover", mOver);
12 addEvent(tdTool[i], "mouseout", mOut);
13 }
14 }
15 }
==================================== js snip end ====================================
window.onload-Idee:
Nachdem mir klar war, dass zunächst nur Events für Elemente registriert werden können, die
im DOM vorhanden sind, habe ich den window.onload()-Ansatz schnell wieder verworfen - logisch,
dass das nur für den ersten Aufruf der Menüleiste und nicht für die dynamischen Klappmenüs
funktionieren kann.
script-Block-im-HTML-Code-Idee:
Letztlich möchte ich die Events nur noch für Elemente registrieren, die noch keine haben. Also
übergebe ich im HTML-Code in Zeile 26 mit Ausführung der onPageLoad-Funktion den konstanten Teil
der TD-ID als Parameter. Dieser ist innerhalb eines Klappmenüs gleich, unterscheidet sich aber
zwischen unterschiedlichen Menüs. Wie's dann weitergeht, seht ihr an der onPageLoad-Funktion.
Diese Variante funktioniert in FF aber nicht im IE 6, der ignoriert hartnäckig die Zuweisung.
Hat jemand 'ne Idee - ich hab keine mehr. Bliebe nur noch, die Events fest im HTML-Code zu
verdrahten, find ich aber nicht besonders sexy.
Danke schon mal und Grüße, dicon