Hallo Kurt
Ich hab mir mühevoll ein DHTML menü geschrieben, funktioniert auch soweit ganz gut, solange ich nur eine Ebene öffne.
Sobald ich aber versuche, aus der ersten Ebene eine zweite zu öffnen, spielt da Script verrückt.
für einen Anfaeger sieht das gar nicht übel aus. Dein Problem ist ein riesiges Timerproblem. Du überschreibst dir dauernd deine Timer.
Der Aufruf erfolgt so:
<a class="sub" id="l2" href="#" onMouseOver="clean1();window.clearTimeout(timer);show_it('divMenu1')"
onMouseOut="timer=window.setTimeout('hide_it('divMenu1')',100);" style="cursor:default;"> ALLGEMEIN<img border="0" src="/images/pix.gif" width="16" height="9" alt=""></a>
hier setzt du den Timer auf Menue 1
<div id="divMenu1" style="visibility:hidden;"
onMouseOver="change('l2','sub2');change('w2','mOverO');window.clearTimeout(timer);show_it('divMenu1')"
onMouseOut="change('l2','sub');change('w2','mOutO');timer=window.setTimeout('hide_it('divMenu1')',100);"><?php include("includes/allgemein/menue.txt") ?></div>
hier löscht du ihn wieder und setzt ihn wieder auf Menue 1
<div id="divMenu4" style="visibility:hidden;"
onMouseOver="change('l5','sub2');change('w5','mOverO');window.clearTimeout(timer);show_it('divMenu4')"
onMouseOut="change('l5','sub');change('w5','mOutO');timer=window.setTimeout('hide_it('divMenu4')',100);">
hier löschst du den Timer von Menue 1 und setzt ihn auf Menue 4. Soweit alles in Ordnung. Wissen muß man allerdings, dass ein mouse-Event auch feuert, wenn ein anderes Element betroffen ist. z.B. ein TD. Die bezeichnet man als Bubbling. Siehe auch http://selfhtml.teamone.de/dhtml/modelle/microsoft.htm#event_bubbling
Dein Mouseover und Mouseout-Event im Div-Tag werden also auch dann wirkungsvoll, wenn eine Tabellenzelle oder Zeile verlassen wird. Du merkst nur nichts davon.
In dieser Zeile
<tr>
<td class="form6" id="w64" onmouseover="change(this.id,'mOver')" onmouseout="change(this.id,'mOut')"><a class="sub" href="#" onMouseOver="window.clearTimeout(timer);show_it('divMenu6');" onMouseOut="timer=window.setTimeout('hide_it('divMenu6')',100);" style="cursor:default;">
Du löschst den Timer auf Menue 4 und setzt ihn auf Menue 6. Danach wirken die mouseevent vom div und dein Timer von Menue 6 wird gelöscht und auf Menue 4 gesetzt. Möchtest du jedoch das Untermenue 6 erreichen, so muß auch dieser Timer gelöscht werden. Hier erfolgt zum ersten Mal ein unerwünschtes Überschreiben der Timer.
<div id="divMenu6" style="visibility:hidden;"
onMouseOver="window.clearTimeout(timer);show_it('divMenu6');show_it('divMenu4');change('w64','mOverO');"
onMouseOut="change('w64','mOutO');timer=window.setTimeout('hide_it('divMenu6')',100);timer=window.setTimeout('hide_it('divMenu4')',200);"><?php include("includes/javascript/popup/menue.txt") ?></div>
hier versuchst du beide Timer wieder anzumelden. Du löscht den Timer auf Menue 4 und blendest Menue 6 ein. Beim Mouseevent ordnest du dann dem Timer Menue 6 zu und überschreibst ihn sofort mit Menue 4
Menue6 wird dadurch programmgemäß ausgeblendet, da keine Referenz auf das Timeout mehr besteht.
Abhilfe vom Timerproblem: du mußt mehrere Timer mitschleppen und koordinieren, was viel Aufwand bereitet.
Alternativ, so habe ich es neulich gelöst, überwachst du die Position des Mauszeigers und blendest in Abhängigkeit davon aus. :-)
Gegenüber der Timerproblematik ist das ein Kinderspiel.
Eine weitere Möglichkeit sind verschachtelte Divbereiche, was für den NN4 zwar wieder Ärger bereitet, aber deine gegenwärtige Variante funktioniert da sowieso nicht.
(Sicherheitshalber hab ich unten die URL zur Seite nochmal eingefügt, für den Fall, daß der Link hier nicht funktioniert. :-)) )
siehe FAQ: </faq/#Q-19>
Ach ja, noch was:
Ich ersuche um ausreichend dokumentierte Antworten, ich bin Anfänger in Sachen JavaScript, mit Verweisen auf allgemeine Problemlösungen oder versteckten Hinwiesen auf Lösungsansätze kann ich recht wenig anfangen, da ich u.U. die Ansätze mit meinen derzeitigen Kenntnissen (noch) nicht verstehe. Also, macht euch bitte die Mühe und antwortet so, daß es auch ein Dummy versteht. :-)
Ich habe mich bemüht, allerdings ist das Thema verteufelt verzwickt und die Lösung auch. Ich hoffe, ich habe mich nicht zu sehr vertimert :-)
Viele Grüße
Antje