(1) Ist das ein sinnvolles/gängiges Vorgehen, zunächst in einer namenlosen automatisch startenden Funktion (function(){...})() die Startbedingungen festzulegen und dann alle weiteren Variablen und Funktionen in einen Container zu packen - also als Methoden, Eigenschaften einer Konstruktor-Fkt.?
Im Grunde kannst du sämtlichen Code so kapseln. Also auch den Konstruktor.
Wenn du etwas nach außen geben willst, so gibst du etwas aus dieser Funktion zurück ober gibst das globale Objekt window in die Funktion hinein und erzeugst daran eine Eigenschaft. (In deinem Beispiel ist das aber wohl nicht nötig.)
(2) Wenn ich einem Element einen Event-Handler zuweisen möchte direkt, nachdem dieser im HTML-Baum erzeugt wurde und nicht erst nach vollständigem Laden aller Elemente, ist da die einzige Lösung, ein eigenes Script nur für diese Aktion zu schreiben und dieses direkt nach dem entsprechenden Element einzubinden (wenn ich auf Event-Handler im tag verzichten will)?
Es wäre die schlechteste Lösung, ständig nach allen möglichen Elementen Scripte einzubinden. Das hätte keinen Vorteil.
Es reicht, DOMContentLoaded zu verwenden - da muss zwar das gesamte HTML geparst werden, aber das reicht i.d.R. aus, sofern selbiges nicht Megabyte groß ist.
Aus Performance-Gründen ist es sinnvoll, <script src> ans Dokumentende zu verschieben. Dann ist ohnehin garantiert, dass du auf alle Elemente über das DOM zugreifen kannst.
- preload images
Das kann der Dragger übernehmen.
- event handling definieren
Das sollte ebenfalls der Dragger übernehmen.
- einge Werte und Bilder-Pfadnamen an öffentl. Methode des Konstruktors übergeben */
Diese kannst du auch direkt an den Konstruktor übergeben.
var General = {
addEvent : function(element, eventName, function_) {
if (typeof(function_) == 'undefined')
return false;
if (element.addEventListener)
element.addEventListener(eventName, function_, false);
else if (element.attachEvent)
element.attachEvent('on' + eventName, function_);
return true;
},
Beachte, dass attachEvent nicht dasselbe macht wie addEventListener.
addOnLoad : function(function_) {
if (document.readyState == 'loading')
General.addEvent(window, 'load', function_);
else
setTimeout(function_, 1);
}
}
Hier solltest du wie gesagt auf DOMContentLoaded setzen.
var dragger_1 = new Dragger();
General.addEvent(document, "mousemove", dragger_1.drag);
General.addEvent(document, "mouseup", function() {dragger_1.dragObjekt = false;});
Diese Aufgaben gehören m.E. in den Dragger, oder wieso sollte das von Außen gemacht werden?
if (document.all) { // warum klappt if(document.ondragstart) nicht???
document.ondragstart = function() {return false;};
ondragstart ist anfangs eine leere Eigenschaft. Sie enthält null o.ä. Wenn du if (document.ondragstart) prüft, bevor du der Eigenschaft einer Funktion zugewiesen hast, trifft die Bedingung natürlich nicht zu.
Wenn du prüfen willst, ob der Browser den Event unterstützt, verwende:
if ('ondragstart' in document) ...
var Presets = { ... };
dragger_1.uebergabe(Presets);
Das kannst du wie gesagt einfach direkt dem Konstruktor als Initialisierungsdaten übergeben.
new Dragger({ ... });
this.drag = function(e) {
posY = document.all ? (window.event.clientY + document.body.scrollTop - document.body.clientTop) : e.pageY;
Verwende bitte keine unbeteiligten Objekte wie hier document.all für Feature-Abfragen. Das ist sehr unzuverlässig. Frage direkt ab, ob e.pageY einen brauchbaren Wert enthält.
return new Boolean(false);
Wieso gibst du hier ein Boolean-Object zurück? Absicht? Ist dir der Unterschied zu einem normalen Boolean?Primitive bewusst?
stripY = parseInt(document.getElementById(that.strip).style.top);
if (stripY < 0 && aktuellePos <= 123) {
document.getElementById(that.strip).style.top = stripY + 2 + 'px';
Wenn du mehrfach auf ein Element zugreifst, so führe »document.getElementById(that.strip)« einmal aus und speichere den Rückgabewert zwischen.
window.setTimeout(function() {stripDown();}, 1);
window.setTimeout(function() {stripUp();}, 1);
Ist dasselbe wie
window.setTimeout(stripDown, 1);
bzw.
window.setTimeout(stripUp, 1);
Wozu die Kapselfunktion?
Ansonsten ist das schon recht sinnvoll strukturiert. Ich würde den Dragger aber noch weiter nach außen abschließen und wie gesagt die zusammengehörige Funktionalität wie das Registrieren der Event-Handler darin vereinigen.
Mathias