Startmenü leidet an Kinderkrankheiten
XaraX
- dhtml
Hallo,
ist es Mums? Sinds die Windpocken? Ich habe keine Ahnung mehr woran es liegen könnte.
Es wird ein durch onClick auf das Wort ein menu() ab Zeile 14 Menü abgeklärt, ob das Start- menü bereis eingeblendet ist oder nicht und läd sich dynamisch erzeugte Daten in Form eines Objekts "z" von http://eddi.to-grip.de/v/01.php bzw. löscht den vohandenen Datenbestand var z Durch Laden von 01.php wird grund() aufgerufen.
Es wird Das Grundmenü erzeugt und dyna- grund() ab Zeile 30 misch eingehängt.
Durch onMouseover wird dabei die Hinter- color() ab Zeile 56 grundfarbe geändert und alle Unterme- nüs gelöscht, die nicht das selbe parentNode haben.
Durch onMouseover wird ein Untermenü dyna- list() ab Zeile 77 misch erzeugt und eingehängt.
============================================================================
Anzeigebeispiel http://eddi.to-grip.de/v/ <iframe src="http://eddi.to-grip.de/v/" width="90%" height="90%">http://eddi.to-grip.de/v/</iframe>
(es ist möglich, daß nur geckos etwas zu sehen bekommen)
Bei mir ist es nicht möglich durch onMouseover auf "Anlegen" die Untermenüs von "eddi" Auszuhängen.
0 : <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 1 : <html> 2 : <head> 3 : <title>Admin</title> 4 : <meta http-equiv="content-type" content="text/html;charset=ISO-8859-1"> 5 : <style type="text/css"> 6 : html,body {padding:0;margin:0;font-family:sans-serif} 7 : table {background:#EEE;border:2px solid #CCC} 8 : td {padding:0px 4px 0px 4px;cursor:default} 9 : 10 : #task {position:fixed;bottom:0px;width:100%;border:none} 11 : </style> 12 : <script type="text/javascript"> 13 : var m=new Array('Filialen','Chat','Warenwirtschaft'); 14 : function menu() 15 : { 16 : if(!document.getElementById("ein").getElementsByTagName("table")[0]) 17 : { 18 : delete(z); 19 : t=document.createElement("script"); 20 : t.setAttribute("src","http://eddi.to-grip.de/v/01.php"); 21 : t.setAttribute("type","text/javascript"); 22 : document.getElementsByTagName("head")[0].appendChild(t); 23 : } 24 : else 25 : { 26 : document.getElementById("task").getElementsByTagName("td")[0].removeChild(document.getElementById("task").getElementsByTagName("td")[0].firstChild) 27 : while(document.getElementsByTagName("head")[0].getElementsByTagName("script").length!=1) document.getElementsByTagName("head")[0].removeChild(document.getElementsByTagName("head")[0].getElementsByTagName("script")[1]); 28 : } 29 : } 30 : function grund() 31 : { 32 : table=document.createElement("table"); 33 : table.setAttribute("cellpadding",0); 34 : table.setAttribute("cellspacing",0); 35 : table.setAttribute("id","neu"); 36 : for(m in z) 37 : { 38 : td=document.createElement("td"); 39 : t=document.createTextNode(m); 40 : td.onmouseover=function(){list(this)} 41 : td.appendChild(t) 42 : tr=document.createElement("tr"); 43 : tr.appendChild(td) 44 : td=document.createElement("td"); 45 : tr.appendChild(td) 46 : tr.onmouseover=function(){color(this)} 47 : table.appendChild(tr) 48 : } 49 : document.getElementById("ein").appendChild(table); 50 : s=document.getElementById("neu").style; 51 : s.position="fixed" 52 : s.zIndex=0; 53 : s.bottom=document.getElementById("task").offsetHeight+"px"; 54 : document.getElementById("neu").removeAttribute("id"); 55 : } 56 : function color(v) 57 : { 58 : delete(t); 59 : t=v.parentNode.childNodes; 60 : for(i=0;t[i];i++) 61 : { 62 : if(t[i]!=v) 63 : { 64 : t[i].style.background='transparent'; 65 : t[i].onmouseover=function(){color(this)} 66 : while(t[i].childNodes[1]) 67 : { 68 : t[i].removeChild(t[i].childNodes[1]) 69 : } 70 : td=document.createElement("td"); 71 : t[i].appendChild(td) 72 : } 73 : } 74 : v.style.background="#DDD"; 75 : v.onmouseover=''; 76 : } 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 : } 86 : y=''; 87 : a=''; 88 : x=v; 89 : y=x.firstChild.nodeValue+'$$$'; 90 : x=x.parentNode.parentNode.parentNode; 91 : while(x.id!="ein") 92 : { 93 : y+=x.parentNode.firstChild.firstChild.nodeValue+'$$$'; 94 : x=x.parentNode.parentNode.parentNode; 95 : } 96 : y=y.split('$$$'); 97 : x=z; 98 : for(i=2;i<=y.length;i++) 99 : { 100: x=x[y[y.length-i]]; 101: } 102: table=document.createElement("table"); 103: table.setAttribute("cellpadding",0); 104: table.setAttribute("cellspacing",0); 105: table.setAttribute("id","neu"); 106: if(y[y.length-2]=='Ich') 107: { 108: td=document.createElement("td"); 109: t=document.createTextNode('Anlegen'); 110: td.appendChild(t) 111: tr=document.createElement("tr"); 112: tr.appendChild(td) 113: td=document.createElement("td"); 114: tr.appendChild(td) 115: tr.onmouseover=function(){color(this)} 116: table.appendChild(tr) 117: if(y[0]!='Ich') 118: { 119: td=document.createElement("td"); 120: t=document.createTextNode('Löschen'); 121: td.appendChild(t) 122: tr=document.createElement("tr"); 123: tr.appendChild(td) 124: td=document.createElement("td"); 125: tr.appendChild(td) 126: tr.onmouseover=function(){color(this)} 127: table.appendChild(tr) 128: 129: td=document.createElement("td"); 130: t=document.createTextNode('Verschieben'); 131: td.appendChild(t) 132: tr=document.createElement("tr"); 133: tr.appendChild(td) 134: td=document.createElement("td"); 135: tr.appendChild(td) 136: tr.onmouseover=function(){color(this)} 137: table.appendChild(tr) 138: 139: td=document.createElement("td"); 140: t=document.createTextNode('Aktionen'); 141: td.appendChild(t) 142: tr=document.createElement("tr"); 143: tr.appendChild(td) 144: td=document.createElement("td"); 145: tr.appendChild(td) 146: tr.onmouseover=function(){color(this)} 147: table.appendChild(tr) 148: } 149: } 150: for(m in x) 151: { 152: td=document.createElement("td"); 153: t=document.createTextNode(m); 154: td.onmouseover=function(){list(this)} 155: td.appendChild(t) 156: tr=document.createElement("tr"); 157: tr.appendChild(td) 158: td=document.createElement("td"); 159: tr.appendChild(td) 160: tr.onmouseover=function(){color(this)} 161: table.appendChild(tr) 162: } 163: if(!v.nextSibling.firstChild) 164: { 165: v.nextSibling.appendChild(table); 166: s=document.getElementById("neu").style; 167: s.position="fixed" 168: s.bottom=document.getElementById("task").offsetHeight+"px"; 169: document.getElementById("neu").removeAttribute("id"); 170: } 171: } 172: </script> 173: </head> 174: <body> 175: <table cellpadding="0" cellspacing="0" id="task"> 176: <tr> <td colspan="2" id="ein" style="padding:0"></td></tr> 177: <tr> <td> 178: <span onClick="menu()">Menü</span> 179: </td> 180: <td></td></tr> 181: </table> 182: </body> 183: </html>
Mir ist klar, daß 184 Zeilen Code nich wirklich schön sind durchzusehen, dallerdings sehen ich keine andere Möglichkeit. Der/die Fehler könnten überall sein... (Tut mir leid :(
Kommtentar zu einzelnen Zielen:
function grund()
Zeile 50-54 Leider habe ich es nicht hinbekommen das Element direkt anzusprechen (table.style). Daher wird eine ID zeitweilig vergeben. Betrifft ebenso 165-169 in list()
function color()
Zeile 69 An dieser Stelle wurde abgeprüft, ob removeChild() seinen Dienst tut. Das macht es. Allerdings wird das Untermenü immer noch an- gezeigt.
function list()
Zeile 79&163 So soll verhindert werden, daß nicht endlos viele Untermenüs eingehangen werden, sondern nur eins (war ein anfängliches Problem).
Zeile 89&101 Die Objektstruktur z entspricht der des Start- menüs und wird so rückerts rekonstruriet, um auf die richtigen Eigenschaften von z zuzu- greifen.
Zeile 106&117 vorerst eingeschoben Später wird dies individuell auf die einzelnen Hauptmenüpunkte jeweils zugeschnitten.
Warscheinlich ist es einfach nur Blindheit. Was und wie muß umgestellt werden, damit Untermenüs ausgehangen werder?
Gruß aus Berlin! eddi
Form eines Objekts "z" von
http://eddi.to-grip.de/v/01.php
eben Objekt, kein array.
z=new Array()
z["Privates"]=0
z["Chat"]=0
z["Ich"]=new Array()
z["Ich"]["eddi"]=0
grund()
z = new Object();
z.Privates = 0;
z.Chat = 0;
z.Ich = new Object();
z.Ich.eddi = 0;
Was mir auffällt an deinem Skript (das einfacher auszuprobieren wäre, wenn du die Zeilennummern weggelassen hättest) ist: bist du sicher, das du this immer richtig verwendest?
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 : }
this zeigt auf das Objekt, das z.b. einen event auslöst, d.h. wenn du eine Tabellenzelle hast und der diese Funktion beim mouseover zuweist, ist this die Tabellenzelle. so wie ich das Skript verstehe, soll die Tabellezelle den Event auslösen und du willst diese in der funktion ansprechen, dazu brauchst du keinen Parameter, this ist die Zelle. Und später in der 84 weist du irgendwelchen Nodes (ich blicvke bei deinem Konstrukt parent.parent.child.firstchild nicht mehr durch) beim mouseover wieder diese Funktion zu, mit dem aktuellen Objekt als Parameter.
Ich vermute mal du willst eher sowas:
var obj = [Tabellenzelle];
obj.onmouseover = list; // ohne Klammern
function list()
{
alert('ich bin die Zelle:' + this);
}
Struppi.
Hallo Struppi,
Danke schon mal für Deine Mühe:
z.Ich.eddi = 0;
Das weiß ich doch leider erst seit gestern ([pref:t=85970&m=507487] & ff.). Da das Obj. z allerdings anhand eine rellen Verzwichnisstruktur dynamisch über 01.php gebildet wird, wird es allerdings später auch der Bezeichnungen von Eigenschafen in urlencode enthalten. Ich werde deswegen warscheinlich auf
var z = {
"propName01": "something",
"propName02": "something else"
};
zurückgreifen müssen.
Was mir auffällt an deinem Skript (das einfacher auszuprobieren wäre, wenn du die Zeilennummern weggelassen hättest) ist:
Bitte tu' Dir kein Zwang an!
HTML: http://eddi.to-grip.de/v/ bzw. der iframe im Posting
Quellcode: http://eddi.to-grip.de/v/zeilen.php
Nummeriert: http://eddi.to-grip.de/v/zeilen.php?nummer
Hatte ich vergessen anzugeben. 'Tschuldigung :) Die Durchnummerierung ist nur besser, um komentare abzugeben.
bist du sicher, das du this immer richtig verwendest?
Jain. Praktisch steht dort <td onMouseover="list(this)"> und in Zeile 79 wird durch v.onmouseover=''; verhindert, bzw. das Event abgestellt, da sonst endlos viele Untermenüs durch list() in v.nextSibling (Zeile 164) eingehangen werden.
Es kann dort auch ein Fehler mit this vorliegen. Versuche mit alert() haben aber immer gestimmt.
Ich vermute mal du willst eher sowas:
var obj = [Tabellenzelle];
obj.onmouseover = list; // ohne Klammern
function list()
{
alert('ich bin die Zelle:' + this);
}
Leider nein. list() hängt die Untermenüs ein, color() löscht sie (allerdings nicht wirklich :'( ).
(klicke einfach auf "Menü" im iframe des Ausganspostings. Ist die Mais auf dem Untermenü zu "ich"=>"Anlegen" dann sollte das Untermenü von "ich"=>"eddi" ausgehangen werden und nciht mehr angezeigt werden. Da ist mein Problem.
Gruß aus Berlin!
eddi
Bitte tu' Dir kein Zwang an!
HTML: http://eddi.to-grip.de/v/ bzw. der iframe im Posting
Quellcode: http://eddi.to-grip.de/v/zeilen.php
Nummeriert: http://eddi.to-grip.de/v/zeilen.php?nummer
Hatte ich vergessen anzugeben. 'Tschuldigung :) Die Durchnummerierung ist nur besser, um komentare abzugeben.
guvk ich mir später mal an.
bist du sicher, das du this immer richtig verwendest?
Jain. Praktisch steht dort <td onMouseover="list(this)"> und in Zeile 79 wird durch v.onmouseover=''; verhindert, bzw. das Event abgestellt, da sonst endlos viele Untermenüs durch list() in v.nextSibling (Zeile 164) eingehangen werden.
Wenn du im HTML Code <td onmoseover="list(this)" schreibst ist das ok, es ist aber was anderes als was du machst. In JS würde das so aussehen:
[td-object].onmouseover = list;
dann ist in der Funktion list *this* das td-object.
das bedeutet, die Funktion kommt auf zwei verschiedenen Arten zu dem Objekt und du kannst diese Funktionen so nicht für beide sachen verwenden. du müßtest den JS Code so umschreiben:
[td-object].onmouseover = function () { list( [td-object] ); };
und nicht this, da this in dem Falle das eltern element ist.
Es kann dort auch ein Fehler mit this vorliegen. Versuche mit alert() haben aber immer gestimmt.
was heißt gestimmt? du hast dir mit this.id z.b. die ID ausgeben lassen?
Ich vermute mal du willst eher sowas:
var obj = [Tabellenzelle];
obj.onmouseover = list; // ohne Klammern
function list()
{
alert('ich bin die Zelle:' + this);
}Leider nein. list() hängt die Untermenüs ein, color() löscht sie (allerdings nicht wirklich :'( ).
(klicke einfach auf "Menü" im iframe des Ausganspostings. Ist die Mais auf dem Untermenü zu "ich"=>"Anlegen" dann sollte das Untermenü von "ich"=>"eddi" ausgehangen werden und nciht mehr angezeigt werden. Da ist mein Problem.
Ich vermute das Problem hängt damit zusammen, das du irgendwann im falschen Objekt bist.
Struppi.
Hallo Struppi,
[td-object].onmouseover = list;
dann ist in der Funktion list *this* das td-object.
Damit arbeitet doch list() - list() muß auch genau mit td-object arbeiten!
das bedeutet, die Funktion kommt auf zwei verschiedenen Arten zu dem Objekt und du kannst diese Funktionen so nicht für beide sachen verwenden. du müßtest den JS Code so umschreiben:
[td-object].onmouseover = function () { list( [td-object] ); };
und nicht this, da this in dem Falle das eltern element ist.
?Nanu?
Um der Verwirrung ein Ende zu bereiten, habe ich nun jeweis color(tr) und list(td) geschrieben. Es gilt dabei:
td=document.cerateElement('td')
tr=document.cerateElement('tr')
http://eddi.to-grip.de/v/index2.html
http://eddi.to-grip.de/v/zeilen.php?v2
http://eddi.to-grip.de/v/zeilen.php?v2=nummer
Keine Funktion tut nunmehr irgentetwas!
this ist doch die Referens auf Element[onmouseover] und funktioniert problemlos im Hauptmenü ('Privates','Chat','ich').
Es kann dort auch ein Fehler mit this vorliegen. Versuche mit alert() haben aber immer gestimmt.
was heißt gestimmt? du hast dir mit this.id z.b. die ID ausgeben lassen?
Ich vermute mal du willst eher sowas:
var obj = [Tabellenzelle];
obj.onmouseover = list; // ohne Klammern
function list()
{
alert('ich bin die Zelle:' + this);
}
Da liegt doch aber der Hase im Peffer: list() arbeitet mit dem Parameter v der eben durch list(this) übergeben werden muß. Die Funktion hat keinerlei Möglichkeiten anders auf die Struktur des Menüs und der Untermenüs zuzugreifen.
Gruß aus Berlin!
eddi
[td-object].onmouseover = list;
dann ist in der Funktion list *this* das td-object.
Damit arbeitet doch list() - list() muß auch genau mit td-object arbeiten!
soweit ich das versteh tust du das nicht.
function list(v)
{
hier ist this = das Objekt von dem der event aufgerufen wird, aber was ist v?
v.onmouseover='';
t=v.parentNode.parentNode.childNodes;
was ist v.parentNode.parentNode?
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 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?
Mir ist nicht klar wohin du hier willst?
Da liegt doch aber der Hase im Peffer: list() arbeitet mit dem Parameter v der eben durch list(this) übergeben werden muß. Die Funktion hat keinerlei Möglichkeiten anders auf die Struktur des Menüs und der Untermenüs zuzugreifen.
wieso nicht?
this ist das Objekt wo der event auftrat, ich vermute: vergiß den Parameter!
Struppi.
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
Oh je, jetzt haben wir uns im Dokumentenbaum verhakt ;)
Also nur mal kurz zum Verständnis, daß v==this ist:
Nein, v ist nicht = this, sondern v ist der Parameter den du übergibst und in deinem HTML Element mit this refrenziert werden kann.
<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".
Das ist die HTML Version, du fügst den Eventhandler aber in JS ein.
<div id="xxx">Text-Inhalt</div>
<script>
var obj = getElementById('xxx');
obj.onmouseover = mach_was;
function mach_was()
{
alert(this.tagName);
}
</script>
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.
Nein, siehe oben. this ist automaotisch mit der Variante das Objekt. Du brauchst dieses Konstrukt nicht so.
Struppi.
Hallo Struppi,
<html>
<head>
<script>
function mach_div()
{
div=document.createElement("div")
t=document.createTextNode("Text-Inhalt")
div.appendChild(t)
div.onmouseover=function(){mach_was(this)}
document.getElementsByTagName('body')[0].appendChild(div)
}
function mach_was(v)
{
alert(v.tagName);
}
</script>
</head>
<body onLoad="mach_div()">
</body>
</html>
Und es steigen die Fragezeichen über meinen Kopf auf.
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.
Nein, siehe oben. this ist automaotisch mit der Variante das Objekt. Du brauchst dieses Konstrukt nicht so.
Sondern wie?
Ich bin Dir wirklich dankbar, daß Du unter ca 45 der einzige bist, der sich wirklich um dieses Problem schert. Leider verstehe ich Dich nicht. Wenn Du schreibst "...Du brauchst dieses Konstrukt nicht so..." Was meinst Du nur damit? Kannst Du dies einfach direkt in einen Beispielcode packen, damit ich abgleichen kann, wie Du dies anders abarbeiten lassen würdes? Danke!
Gruß aus Berlin!
eddi
<html>
<head>
<script>
function mach_div()
{
div=document.createElement("div")
t=document.createTextNode("Text-Inhalt")
div.appendChild(t)
div.onmouseover=function(){mach_was(this)}
document.getElementsByTagName('body')[0].appendChild(div)
}
function mach_was(v)
{
alert(v.tagName);
}
</script>
nein nein und nochmals nein.
this ist hier das Dokument bzw. body, da du die Funktion so aufrufst: <body onload="...">
D.h. du übergibst dem event den Body.
Mach es so:
function mach_div()
{
div=document.createElement("div")
t=document.createTextNode("Text-Inhalt")
div.appendChild(t)
div.onmouseover= mach_was;
document.getElementsByTagName('body')[0].appendChild(div)
}
Ich bin Dir wirklich dankbar, daß Du unter ca 45 der einzige bist, der sich wirklich um dieses Problem schert. Leider verstehe ich Dich nicht. Wenn Du schreibst "...Du brauchst dieses Konstrukt nicht so..." Was meinst Du nur damit? Kannst Du dies einfach direkt in einen Beispielcode packen, damit ich abgleichen kann, wie Du dies anders abarbeiten lassen würdes? Danke!
Wie gesagt es ist schwierig aus einem Code zu erraten was du machen willst und auch ich hatte bisher keine Lust eben code selber zu testen.
Struppi.
Hallo Struppi,
<html>
<head>
<script>
function mach_div()
{
div=document.createElement("div")
t=document.createTextNode("Text-Inhalt")
div.appendChild(t)
div.onmouseover=function(){mach_was(this)}
document.getElementsByTagName('body')[0].appendChild(div)
}
function mach_was(v)
{
alert(v.tagName);
}
</script>nein nein und nochmals nein.
Probierst Du bitte erst aus, ob dabei "BODY" oder "DIV" usgegeben wird und widerholst dies dann erhaben ;)
this ist mehr als eine Referens (auch wenn ich nicht viel weiß, aber das scheint es zu sein
this ist hier das Dokument bzw. body, da du die Funktion so aufrufst: <body onload="...">
D.h. du übergibst dem event den Body.Mach es so:
function mach_div()
{
div=document.createElement("div")
t=document.createTextNode("Text-Inhalt")
div.appendChild(t)
div.onmouseover= mach_was;
document.getElementsByTagName('body')[0].appendChild(div)
}
<html>
<head>
<script>
function mach_div()
{
div=document.createElement("div")
t=document.createTextNode("Text-Inhalt")
div.appendChild(t)
div.onmouseover= mach_was;
document.getElementsByTagName('body')[0].appendChild(div)
}
function mach_was(v)
{
alert(v.tagName);
}
</script>
</head>
<body onLoad="mach_div()">
</body>
</html>
Wenn Du doch bitte bloß diesen Code probieren würdest und sebst feststellen würdest, das die Ausgabe "undefined" ist, dann könnten wir zum eigentlichen Problem wieder übergehen.
Gruß aus Berlin!
eddi
Hallo Struppi,
Probierst Du bitte erst aus, ob dabei "BODY" oder "DIV" usgegeben wird und widerholst dies dann erhaben ;)
this ist mehr als eine Referens (auch wenn ich nicht viel weiß, aber das scheint es zu sein
das Wort "rekursion" wurde verschluck ?!?! Forumbug?
Gruß aus Berlin!
eddi
<script>
function mach_div()
{
div=document.createElement("div")
t=document.createTextNode("Text-Inhalt")
div.appendChild(t)
div.onmouseover= mach_was;
document.getElementsByTagName('body')[0].appendChild(div)
}
function mach_was(v)
{
alert(v.tagName);
}
Nein,
function mach_was()
{
alert(this.tagName);
}
Struppi.
<html>
<head>
<script>
function mach_div()
{
div=document.createElement("div")
t=document.createTextNode("Text-Inhalt")
div.appendChild(t)
div.onmouseover=function(){mach_was(this)}
document.getElementsByTagName('body')[0].appendChild(div)
}
function mach_was(v)
{
alert(v.tagName);
}
</script>nein nein und nochmals nein.
Probierst Du bitte erst aus, ob dabei "BODY" oder "DIV" usgegeben wird und widerholst dies dann erhaben ;)
this ist mehr als eine Referens (auch wenn ich nicht viel weiß, aber das scheint es zu sein
Hier hast mal recht.
Ich bin davon ausgegangen, das das this was in "mach_div()" gültig ist genommen wird, das stimmt aber nicht. D.h. dein code macht genau das:
div.onmouseover = mach_was;
function mach_was()
{
alert(this.tagName);
}
Struppi.
Hallo Struppi,
ich hoffe wir sind uns jetzt einig, es lediglich ein Unterschied in der Notation ist, nicht in der functionsweise, aber wo ist nun der Fehler, daß die Untermenüs der Untermenüs nicht abgehangen werden?
(Deine Funktionsweise war mir bis jetzt nicht bekannt, wieder was gelernt ;)
Gruß aus Berlin!
eddi
tut mir leid, ich hab mir das ganze mal angeguckt, aber das Skript macht auf mich einen unnötig komplizierten Eindruck, auch der Einsatz von kryptischen globalen Variabelnamen macht es nicht einfacher und das dann irgendwas noch dynamisch zur Laufzeit nachgeladen wird, läßt mich jetzt die Lust verlieren zu verstehen was du da genau machst.
Das einzige was mir trotzdem aufgefallen ist:
if(y[y.length-2]=='Ich')
{
...
Die Bedingung ist sowohl bei 'eddi' als auch bei 'anlegen' wahr und nachfolgend erscheint das Untermenü, bei beiden Punkten. und das ist was du ja nicht willst, insofern musst du die Bedingung verfeinern, wobei ich aber sicher bin, man könnte das ganze wesentlich eleganter lösen. wie hängt davon ab was du genau machen willst.
Struppi.
Hallo Struppi,
tut mir leid, ich hab mir das ganze mal angeguckt, aber das Skript macht auf mich einen unnötig komplizierten Eindruck,
Was an welchen stellen? Was kann, da es unnötig ist, verbessert werden?
auch der Einsatz von kryptischen globalen Variabelnamen macht es nicht einfacher und das dann irgendwas noch dynamisch zur Laufzeit nachgeladen wird, läßt mich jetzt die Lust verlieren zu verstehen was du da genau machst.
Kryptisch wird es erst, wenn der Fehler gefunden ist und die wiederkehrenden Definitionen den platzsparenden Schleifen gewichen sind, aber ich seh schon... keine Lust; Danke trotzdem!
Das einzige was mir trotzdem aufgefallen ist:
if(y[y.length-2]=='Ich')
{
...
Innerhalb dieser if-Anweisung wird kein einziges Element aus dem Document ausgehängt, es werden nicht mal welche eingehängt. Es werden Variablen definiert. Wie kommst Du auf den Gedanken, hier könnte ein Grund für die offensichtliche Fehlfunktion liegen?
Die Bedingung ist sowohl bei 'eddi' als auch bei 'anlegen' wahr und nachfolgend erscheint das Untermenü, bei beiden Punkten.
Jain. Es erscheint teilweise. Das hatte ich aber in den Kommentaren zu einzelen Zeilen geschrieben. Dies ist nur vorläufig eingeschoben. Deine Schlußfolgerung ist korrekt und im übrigen auch gewollt.
und das ist was du ja nicht willst,
Wo steht, das ich das nicht will?
insofern musst du die Bedingung verfeinern, wobei ich aber sicher bin, man könnte das ganze wesentlich eleganter lösen.
Ich bitte um jeden Tip! Was ist wie eleganter zu lösen?
wie hängt davon ab was du genau machen willst.
Ich möchte ein Startmenü machen, das die Verzeichnisstruktur auf meinem Server ab Verzeichnis X abbildet. Da Verzeichnisstrukturen leider die angewohnheit haben, sich zu ändern ist es notwendig, das diese Daten nicht beim Laden des Dokuments eingelesen werden, sondern bei jeder Darstellung des Startmenüs aufs Neue. Das ist auch der Grund, warum diese Daten geladen werden. Allerdings verstehe ich nicht, wie Dich dies verwirren kann. Es ist doch das selbe, als wären sie im Dokument definiert.
Ich möchte, daß Untermenüs nur dann im Baum des Startmenüs eingehangen sind, wenn ein hover auf eine Tabellenzelle stattfindet und das Untermenü Nachfahre des Elternelements dieser Tablellenzelle ist.
Mehr will ich gar nicht ;)
Gruß aus Berlin!
eddi
tut mir leid, ich hab mir das ganze mal angeguckt, aber das Skript macht auf mich einen unnötig komplizierten Eindruck,
Was an welchen stellen? Was kann, da es unnötig ist, verbessert werden?
Daum müßte man das ganze nachvollziehen können, was aber aus den geannten Gründen nicht einfach ist.
auch der Einsatz von kryptischen globalen Variabelnamen macht es nicht einfacher und das dann irgendwas noch dynamisch zur Laufzeit nachgeladen wird, läßt mich jetzt die Lust verlieren zu verstehen was du da genau machst.
Kryptisch wird es erst, wenn der Fehler gefunden ist und die wiederkehrenden Definitionen den platzsparenden Schleifen gewichen sind, aber ich seh schon... keine Lust; Danke trotzdem!
Wie gesagt, die einzige Möglichkeit wäre, wenn ich mir da sSkript runterladen und schrittweise durchgehen würde, aber das hieße, dass ich es quasi komplett schreiben würde, dazu müßte mich der Ansatz reizen, das tut es aber im Moment nicht.
Das einzige was mir trotzdem aufgefallen ist:
if(y[y.length-2]=='Ich')
{
...Innerhalb dieser if-Anweisung wird kein einziges Element aus dem Document ausgehängt, es werden nicht mal welche eingehängt. Es werden Variablen definiert. Wie kommst Du auf den Gedanken, hier könnte ein Grund für die offensichtliche Fehlfunktion liegen?
Ich hatte mal eine alert eingebaut und der wird immer aufegerufen sobald die zweite Ebenen offen ist.
Das folgende sind die Zeilen nach der Bedingung:
td=document.createElement("td");
t=document.createTextNode('Anlegen');
td.appendChild(t)
tr=document.createElement("tr");
tr.appendChild(td)
td=document.createElement("td");
tr.appendChild(td)
tr.onmouseover=function(){color(tr)}
table.appendChild(tr)
if(y[0]!='Ich')
{
td=document.createElement("td");
t=document.createTextNode('Löschen');
td.appendChild(t)
tr=document.createElement("tr");
tr.appendChild(td)
td=document.createElement("td");
tr.appendChild(td)
tr.onmouseover=function(){color(tr)}
table.appendChild(tr)
td=document.createElement("td");
t=document.createTextNode('Verschieben');
td.appendChild(t)
tr=document.createElement("tr");
tr.appendChild(td)
td=document.createElement("td");
tr.appendChild(td)
tr.onmouseover=function(){color(tr)}
table.appendChild(tr)
td=document.createElement("td");
t=document.createTextNode('Aktionen');
td.appendChild(t)
tr=document.createElement("tr");
tr.appendChild(td)
td=document.createElement("td");
tr.appendChild(td)
tr.onmouseover=function(){color(tr)}
table.appendChild(tr)
}
Da wird nichts eingehängt?
sieht für mich so aus, als ob hier das von dir nicht gewünschte untermenü erzeugt wird.
Die Bedingung ist sowohl bei 'eddi' als auch bei 'anlegen' wahr und nachfolgend erscheint das Untermenü, bei beiden Punkten.
Jain. Es erscheint teilweise. Das hatte ich aber in den Kommentaren zu einzelen Zeilen geschrieben. Dies ist nur vorläufig eingeschoben. Deine Schlußfolgerung ist korrekt und im übrigen auch gewollt.
und das ist was du ja nicht willst,
Wo steht, das ich das nicht will?
Du willst es nur beim Punkt 'eddi' haben aber nicht bei 'anlegen' oder hab ich das falsch verstanden?
insofern musst du die Bedingung verfeinern, wobei ich aber sicher bin, man könnte das ganze wesentlich eleganter lösen.
Ich bitte um jeden Tip! Was ist wie eleganter zu lösen?
das du die Kindermenüs abhängig von den Elternpunkten machst und nicht jedesmal die ganze Tabele durchläufst. (wobei ich aber zugegebenerweise nciht sehe ob das nicht schon der Fall ist, aber es sieht zumindest für mich nicht so aus)
Ich möchte, daß Untermenüs nur dann im Baum des Startmenüs eingehangen sind, wenn ein hover auf eine Tabellenzelle stattfindet und das Untermenü Nachfahre des Elternelements dieser Tablellenzelle ist.
Dazu musst du lediglich eine verkette Liste machen, wo bei einem over das Kind gezeigt wird und bei einem out wieder weggemacht wird.
Struppi.
Hallo Struppi,
Vorschlag: Ich sammle mich noch mal und würde Dich bitten (bzw. ach jeden anderen) hier nicht mehr zu posten. Dann stelle ich die Frage noch mal anhand des neuen Codes in ein paar Tagen.
Es ist richtig das Untermenü von "Anlegen" ist auch nicht gewünscht. Aber das ist ein einfaches Randproblem, was ich in den Zeilen 82-85 ganz einfach abzustellen kann.
Und ich verstehe nun auch, warum Du wir beide nicht auf einen grünen Zweig kommen: Du arbeitest mit dem Beispielkode aus der index2.html... Denn hatte ich nur aus Demonstrationszwecken erstellt, als wir noch über "this" verhandelt haben ;)
Das in dem gepostenten Ausschnitt 108-142 nichts in den Dokumentenbaum eingehangen wird ergibt sich aus Zeile 102-105.
Gruß aus Berlin!
eddi