XaraX: Startmenü leidet an Kinderkrankheiten

Beitrag lesen

Re:

Damit arbeitet doch list() - list() muß auch genau mit td-object arbeiten!

soweit ich das versteh tust du das nicht.

Oh je, jetzt haben wir uns im Dokumentenbaum verhakt ;)
Also nur mal kurz zum Verständnis, daß v==this ist:

<html>
<head>
<script>
function mach_was(v)
  {
  alert(v.tagName);
  }
</script>
</head>
<body>
<div onMouseover="mach_was(this)">Text-Inhalt</div>
</body>
</html>

Ergibt als Ausgabe "DIV".

function list(v)
{

hier ist this = das Objekt von dem der event aufgerufen wird, aber was ist v?

Ich muß doch this innerhalb der Funktion ansprechen können (vlg.: http://localhost/doc/selfhtml/javascript/sprache/funktionen.htm#aufrufen). Dies erreiche ich, in dem ich "function list(v)" notiere. Damit kann ich das übergebene Element des Documents innerhalb der Funktion als "v" ansprechen.

v.onmouseover='';

t=v.parentNode.parentNode.childNodes;

was ist v.parentNode.parentNode?

list() wird nur von dem Element <TD> aufgerufen und anders, als normale tables ist bei diesen dynamischen tables v.parentNode.parentNode.tagName=="TABLE" (bei hartcodierten Tabellen wäre dies "TBODY", der wird aber nicht eingehangen und ist somit auch nicht ansprechbar)

t=v.parentNode.parentNode.childNodes; bezeichnet also alle Elemente "TR" (Zeilen) des table, in dem der Event eingetreten ist.

for(i=0;t[i];i++)
  if(t[i].firstChild!=v)
   {
   t[i].firstChild.onmouseover=function(){list(t[i].firstChild)}

Du gehst alle firstChild Elemente des Großelternobjektes (parent von parent) durch

NEIN! Ich gehe alle jeweils ersten Kindelemente der Kindelemente des Großelternobjektes "TABLE" durch. (Ich spreche alle ersten Elemente "TD" an [pro Zeile gibt es nämlich zwei vgl. grund(){Zeile 38 & 44}, list(){bsw. Zeile 152 & 158}], und übergebe ihnen wenn sie nicht das eventausgelösten Element sind (t[i].firstChild!=v) für das Attribut onmouseover die Funktion list(this).
Dies muß deshalb stattfinden, da jedes Element, das list() aufgefuren hat, durch v.onmouseover='' kein Event mehr hat.

und wenn dies ungleich von v (was ist v?) ist, fügst du diesen onmouseover event hinzu. Der Parameter ist das Kindobjekt des firstChild elementes das nicht der Parameter v ist?

Wie gesagt das geht auch nicht! In der Ursprungsvariate, die soweit funktioniert, ist v das Element "TD".

77 : function list(v)
78 :         {
79 :         v.onmouseover='';
80 :         t=v.parentNode.parentNode.childNodes;
81 :         for(i=0;t[i];i++)
82 :                 if(t[i].firstChild!=v)
83 :                         {
84 :                         t[i].firstChild.onmouseover=function(){list(this)}
85 :                         }

77 :   Das TD-Element hat einen Event, der ausgeschrieben
       so aussieht: <td onMouseover="list(this)">
       Mit anderen Worten übergibt es sich selbst als Pa-
       rameter der Funktion list().

79 :   Damit, während die Maus über der Tabellenzelle ist,
       durch den fortwährenden Event onMouseover list()
       nicht endlos oft aufgerufen wird, löscht
       v.onmouseover=''; den Event einfach herraus.
       Er ist de facto nicht mehr existent. list() wird
       nur einmal aufgerufen und es werden nicht endlos
       viele Untermenüs eingehängt.

80 ff: Dadurch, das der Event gelöscht wurde, ergibt sich
       ein Problem, wenn ich mit der Maus auf "Ich" war;
       danach die Maus auf "Chat" verschiebe.
       Wenn ich jetzt von "Chat" die Maus wieder auf "Ich"
       verschieben würde, ohne daß der Event für "Ich"
       wieder hinzugefügt wird, würde sich kein Untermenü
       mehr auftun, da der Event von list() in Zeile 79
       gelöscht wurde. Also muß von Sicht aus des
       eventauslösenden Elements jedes andere Element TD,
       was diesen Event onMouseover="list(this)" vorher
       bereits ausgelöst haben könnte und ihn daher nicht
       mehr haben könnte, wieder bekommen.

wieso nicht?
this ist das Objekt wo der event auftrat, ich vermute: vergiß den Parameter!

Führe mal bitte diesen Gedanken aus.

Gruß aus Berlin!
eddi