bubble: drag&drop element wird nicht gespeichert

Beitrag lesen

window.setTimeout(GUIInit(), 100); //Führt zu einem Fehler, falls GuiInit nicht zufällig eine Funktion zurückgibt

window.setTimeout(GUIInit, 100); // Müsste funktionieren

Funktioniert auch einwandfrei :) Ein wirklich dummer Fehler meinerseits >.<

// Beides ist allerdings hässlich, besser du machst folgendes

document.addEventListener("DOMContentLoaded",GUIInit); // dann kannst du sicher sein, dass dein DOM-Baum fertig geladen hat

  
Später soll die GUIInit noch komplexer werden, um zb. dynamisches Nachladen zu ermöglichen, mit dem EventListener unter JS hab ich mich generell noch nicht wirklich beschäftigt, deswegen kam mir diese (noch) unschöne Lösung gelegen.  
  

> Das könnte widerum mit deinem Problem zu tun haben. Durch setTimeout("GUIInit()",100) wird GUIInit in einem anderen Scope, wenn nicht sogar in einem anderen Scope aufgerufen. setTimeout arbeitet hier ähnlich wie "eval()".  
>   
> Als nächstes hierzu:  
> >`window.GUIenv = new GUIEnvironment(body);`{:.language-javascript}  
>   
> Warum machst du GUIenv zu einer Eigenschaft von window? Ich sehe keinen Grund dafür und würde GUIenv besser zu deinem Programm-Scope hinzufügen.  
  
Damit ich zum einem weiß wie ich darauf zugreifen kann (ich war mir nie recht sicher wann eine Instanz/Variable global ist oder nicht, da window ja global sein sollte, kann ich dann auch darauf zugreifen), zum anderem um eventuelle spätere Spieleren mit Sachen wie Greasemonkey zu vereinfachen/ermöglichen  
  

> Apropros Scope du solltest dein Programm in einen closure packen um keine unnötigen globalen Variable zu erzeugen. In etwa so:  
>   
> ~~~javascript
  

> (function(){  
>   // dein Programmcode  
> }());  
> 

Falls das alles immernoch nicht hilft, ich bin noch ne Weile wach.

Ja, hier wieder mein Problem, dass ich noch nicht recht weiß, wann eine Variable global wird.
Wenn ich mir meinen bisherigen Code angucke, werden eigentlich nur die Funktionen global

Am Beispiel der GUIInit:

function GUIInit()  
{  
	body = document.getElementsByTagName("body")[0];  
	if(body)  
	{  
		window.GUIenv = new GUIEnvironment(body);  
		document.onmousemove = GUIenv.doDrag;  
		document.onmouseup = GUIenv.stopDrag;  
  
  
		win = new GUIWindow("testWin","Test window",0);  
		win.create();  
	}  
	else  
		window.setTimeout(GUIInit, 100);  
}  

body und win sollte nicht global sein, da sie im Gültigkeitsbereich der Funktion deklariert werden. Im Gegenzug sollte GUIenv zur Eigentschaft der des global window-Objektes werden.

Wenn ich jetzt den kompletten Code der JS-Datei in ein Scope packe,

  
(function(){  
  // um genau zu sein, hier  
}());

hätte ich zwar weiterhin Zugriff auf GUIenv und deren Eigenschaften/Kindelementen (über window), aber der Konstruktor GUIwindow wäre zB. über ein späteres <script>-Segment der HTML-Datei nicht mehr bekannt, oder doch? Und wenn ja, warum?

Das einzige was mir einfallen würde, wo ein Scope Sinn ergibt wäre somit die Funktion GUIinit, damit diese nicht doppelt aufgerufen wird, was wiederum mit dem setTimeout(GUIinit, 100) Probleme ergeben dürfte.

Der eigentliche Fehler, dass this.dragObj kein gültiges Element ist besteht immernoch. (Um nicht komplett vom Thema abzuscheifen >.<)

MfG
bubble