Hallo,
Hallo Struppi,
Und – das könnt ihr mir hoffentlich bestätigen – auch folgende Variante funktioniert:
window.onload = function () { ({...}).init(); };
Ist ja auch logisch, weil onload jetzt eine richtige Funktion ist.
Nein das funktioniert nicht, neben der falschen Klammerung, weist du onload keine Funktionsreferenz zu, sondern den Rückgabewert der Funktion init()
Ähem... kann es sein dass du dich jetzt irrst? Aufgedröselt ist es doch so:
window.onload = function () // => eine Funktionsreferenz wird zugewiesen,
{
({...}).init(); // => im Funktionskörper wird eine Funktion ausgeführt, die keinen Rückgabewert hat,
}; // => das war's. Es wird auch nichts zurückgegeben.
Keine der Funktionen gibt also etwas zurück, aber die Zuweisung ist eine Funktionsreferenz.
Das habe ich nun wirklich getestet, überzeuge dich selbst:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head><title>onload-Test</title>
<script type="text/javascript">
[code lang=javascript]
window.onerror = function(msg, file, line) {alert( msg + '\n' + line);}
window.onload = function () {
({
inputField: document.getElementById("InputField"),
actionButton: document.getElementById("ActionButton"),
init: function () {
var that = this;
this.actionButton.onclick = function () {that.action()};
},
action: function () {
if (this.inputField.value) {
alert(this.inputField.value);
this.inputField.value = "";
} else {
this.inputField.value = "Gib mir Text..."
this.inputField.focus();
}
}
}).init();
};
</script>
</head>
<body>
<div id="Ich_existiere_nur_feur_den_Validator">
<input id="InputField">
<input id="ActionButton" type="button" value="OK">
</div>
</body>
</html>[/code]
Ich widerspreche inzwischen nur noch sehr ungern, aber das ist doch wirklich der Beweis.
Du benutzt zuviele Klammern
Wo genau?
window.onload = function () { ({...}).init(); };
------------------------------^-----^-----^^
von diesen kann man keine weglassen (s.u.), die übrigen braucht es natürlich wie für jede Funktion und die geschweiften inneren für das Objekt-Literal.
var myHandler = function() {
/* tu viele Dinge, wenn die Funktion aufgerufen wird * /
};object.onevent = myHandler;
Das ist im Prinzip klar, aber wenn myHandler eine Methode irgend eines Objekts ist, dann hat sie, wenn der Event eintritt nicht ohne weiteres Zugriff auf die andere Eigenschaften und Methoden des Objekts, dessen Methode sie ist (this in myHandler ist ja üblicherweise das Objekt, das den Event ausgelöst hat, soviel ich weiß). Deshalb will ich über window.onload (also erst wenn alle DOM-Elemente existieren) sämtliche Eventhandler an ihre DOM-Elemente binden und zwar so, dass die Handler immer Zugriff auf die Eigenschaften und Methoden des Objekts haben (quasi an Stelle von Parametern), in dem die Handler definiert sind.
> Das Problem mit der gewünschten Kapselung erreichst du aber nicht anders.
>
> ~~~javascript
(function() {
> /* Diese Funktion wird sofort aufgerufen */
> })()
Das ist doch fast genau das, was ich oben mache, nur dass ich nicht "Diese Funktion" sofort aufrufe, sondern die Methode init "Dieses Objekts".
(
{
/* Die Methode init dieses Objekts wird sofort aufgerufen */
}
).init()
und hier kannst du keine Klammern weglassen.
Stimmt.
Gruß, Don P