Eventhandler verschwindet immer

FipsTheThief

Erfahrenes Mitglied
Ich hab so ein kleines Problem das ich eben nicht verstehen kann so richtig. Ich habe quasi ein Menu gesehen. Ehm ja Link vergessen leider es war s o aufgebaut mehere Menupunkte wie Reiter untereinander. Wenn man auf einen geklickt hat , dann hat sich dort ein neues Fenster aufgebaut.

Da ich aber nun nicht nach jeden Reiter gleich einen Div Layer einbauen will der nur die Höhe von 0 pixeln hat. Habe ich mir überlegt naja versuchen wir sie einfach dynamsich einzubauen.

Klappt soweit schon , blos nun kommt das Problem. Sobald ich den neuen Div nun einfach mal einfüge kann ich nun nicht mehr auf den obergeordneten Reiter klicken.

Das soll heissen wenn ich es von oben nach unten abarbeite , dann klappt des ganz gut abgesehen das der Eventhandler dann auch nicht mehr funktioniert wenn ich auf den selben Reiter noch einmal klicke.
Sollte ich nun zuerst auf den Mittleren reiter klicken dann kann ich ebenfalls nicht mehr den obergeordneten anklicken bzw startet der Event nicht mehr.Eine sehr merkwürdige Angelegenheit momentan hier mal das Script dazu.

HTML:
<html>
    <head>
        <style type="text/css">
            div.mainWindow {
                position:absolute;
                width:300px;
                background-color:#FF0000;
            }
            
            div.subWindow {
                position:relative;
                top:0px;
                float:left;
                height:21px;
                width:100%;
                border-bottom:1px solid;
                border-top:1px solid;
            }
            
            div.subContent {
                position:relative;
                height:125px;
                width:100%;
            }
        </style>
        <script type="text/javascript">
        
            var LayerMenu = new Object;
            LayerMenu.construct = function (groundID) {
            
                var thisObj = this;
                thisObj.groundId = groundID;
                                
                thisObj.addMenuField = function (name,id,cn) {
                    var button = document.createElement("div");
                    var text   = document.createTextNode(name);
                    button.appendChild(text);
                    button.id = id;
                    button.className = cn; 
                    
                    document.getElementById(thisObj.groundId).appendChild(button);
                }
                
                thisObj.insertField = function () {
                    
                    alert(document.getElementById('subWindow'));
                    
                    var nodeElement = document.getElementById(thisObj.groundId).firstChild;
                    var subElement  = document.createElement('div');
                        subElement.className = 'subContent';
                    
                    if(nodeElement.id == this.id) {
                    
                        var nodeRoot = nodeElement.nextSibling;
                        document.getElementById(thisObj.groundId).insertBefore(subElement,document.getElementById(nodeRoot.id));
                        
                    } else {
                    
                        while (nodeElement) {
                        
                            nodeElement = nodeElement.nextSibling;
                            if(nodeElement.id == this.id) {
                                var nodeRoot = nodeElement.nextSibling;
                                document.getElementById(thisObj.groundId).insertBefore(subElement,document.getElementById(nodeRoot.id));
                                break;
                            }
                            
                        }                        
                    }

                    
                }
            }
        
            window.onload = function () {
                //var Element = document.createElement("button");
                var menu = new LayerMenu.construct('mainWindow');
                menu.addMenuField('klaus','subWindow','subWindow');
                menu.addMenuField('peter','subWindow1','subWindow');
                menu.addMenuField('fred','subWindow2','subWindow');
                
                // die habe ich hier mal eingefügt nun einfach
                document.getElementById('subWindow').onclick = menu.insertField;
                document.getElementById('subWindow1').onclick = menu.insertField;
                document.getElementById('subWindow2').onclick = menu.insertField;
            }
        </script>
    </head>
    <body>
        <div class="mainWindow" id="mainWindow"></div>
    </body>
</html>
 
Naja...dein Skript erzeugt jedesmal dann, wenn du auf einen "Button" klickst, und sich nicht das gewünschte tut, einen Fehler(siehe JS-Konsole:ungültige Argumente/erforderliche Objekte).
Der Funktionsaufruf erfolgt also weiterhin, allerdings tut er wegen des Fehlers nicht mehr das, was er eigentlich soll.

Könntest du etwas genauer ausführen, was dort jeweils passieren soll?
Beim ersten Klick den Layer einknoten...und was soll passieren, wenn man wieder raufklickt?
 
Erstmal ist es so gedacht das es 1 - x Reiter werden .
Das soll heissen das ich dann so eine Struktur habe wie

[ Hallo Welt ]
[ Foo Bar ]
[ halt noch was]

wenn ich nun auf "Hallo Welt" klicke dann verschieben sich die beiden Reiter FooBar und "halt noch was nach unten" und dazwischen wird nun der neue Div Layer eingeklemmt.

So soll es mal laufen :
Sollte ich nun auf FooBar klicken , dann verschwindet die Fläche unter Hallo Welt wieder , das FooBar rutscht nun nach oben und naja der Layer wird dann dort eingebaut. Das sollte passieren wenn es fertig ist , momentan probiere ich mich daran noch ein wenig.

Was passieren soll wenn man nochmal drauf klickt das habe ich noch nicht eingebaut.

Bei dem Script geht das mit dem letzten Layer nun noch nicht , wenn ich auf "halt noch was klicke" , versucht er das nächste element zu nehmen welches nicht existiert und es davor zu hängen da geht er natürlich mit einen fehler drauf.

Die Abfrage fehlt hier noch also bitte ich das nun mal zu tollerieren ;)

Ich hab das nun einfach mal getestet mit , der onclick Event wird ja nun auf
thisObj.insertField gelenkt. Da ich weiss das das letzte Element einen fehler verursacht klickte ich hier immer auf das 1. Der Layer wird normal eingehangen. So klicke ich nochmal dann kommt er gar nicht mehr zu diesem Event, er geht schlicht weg nicht mehr in die Funktion rein .

Der Fehler trat auf wenn ich auf Foobar geklickt hab, dann hat sich die Fläche ausgefahren. Hab ich nun auf Hallo welt geklickt ging gar nix mehr, wobei er nun rein theoretisch dort auch noch ein Layer einhängen sollte erstmal.

Habe ich es so gemacht , erst auf "Hallo Welt" geklickt Layer wurde eingebaut, nun habe ich auf "Foo Bar" geklickt ebenfalls eingebaut. Da klappte es , naja bis auf das letzte Element und natürlich dann erneutes klicken , sollte zwar nix passieren aber nen alert kann man ja dennoch ausgeben um zu überprüfen ob er überhaupt noch den Event ausführt.
Beim ersten mal kam der Alert beim 2. mal eben nicht mehr.Das ist es ja was mich so verwundert , Fehler mhm da kenn ich nur die Meldung vom letzten Layer das er das dort nun nicht einhängen kann da das Element nicht existiert.
 
Ich habe den Fehler gefunden , das lag gar nicht an dem JavaScript ansich, der hat nur immer den eingefügten Layer durch die CSS Angaben einfach drüber gelegt. Wobei ich immer vermutet habe das durch position:relative sich das am Rest halt ausrichtet mit.

Dabei passierete folgendes ,

Code:
	div.subWindow { 
		position:relative; 
		top:0px; 
		height:21px; 
		width:100%;
                  float:left;  // hier steckt der Teufel im Detail oder bei Top 0px seh ich eben
		border-bottom:1px solid; 
		border-top:1px solid;
	}

Sollte man dies float left nun einfach entfernen wird der Layer wie gewünscht richtig reingeschoben und nicht einfach drüber gelegt. Ein dicker blauer Rahmen hat mir das mal so gezeigt ;) Wobei ich vermutet habe , float:left , das Ding hat 100% weite dann sollte der eingeschobene layer nun drunter liegen eigentlich. Naja Dummheit schützt vor Strafe nicht und wie das so immer ist , der Fehler ist schon so simpel das man es nicht glaubt das es daran liegen könnte ;) Sollte mich mal mehr mit dem CSS beschäftigen in Zukunft *G*

Zur Verbesserten Veranschaulichung nochmal was passieren sollte wenn es fertig ist Erklären war noch nie so meine Stärke, nun hab es ich es geknackt ;) noch ein wenig optimieren dann kanns raus.
Aber soweit geht es noch ganz gut , bitte nicht über die Farben klagen ich weiss die sehen furchtbar aus. Hier noch einmal der komplette File dazu als Anhang.
 

Anhänge

Zuletzt bearbeitet:

Neue Beiträge

Zurück