Verwirrend: "onload = Funktion()" im Javascript
Hans Thomas Vogler
- javascript
Hello again,
alternativ zur HTML-Implementierung (<body onLoad="Funktion">) kann man in Javascript offenbar eine festgelegte Variable "onload" verwenden nach folgendem Muster:
<script type="text/javascript">
<!--
function init(){
alert('Hello again!')
return
}
onload = init()
//-->
</script>
Netscape und Mozilla akzeptieren das anstandslos, aber mein IE 5.5 tut was seltsames:
Zunächst führt er die Funktion aus.
Dann aber meckert er mich an, das Kommando auf Zeile XY (wo "onload = init()" steht) sei "nicht implementiert" und ich könne mir diese Fehlermeldung anzeigen lassen, wenn ich auf das Warnzeichen links unten in der Statusleiste klicke.
Das allerdings ist nur zu sehen, während das Warnungsfenster aktiv ist. Nach "OK" verschwindet es gleich wieder und ich bekomme auch keine Fehleranzeige mehr.
Andererseits weiß ich, daß der DHTML-Guru Thomas Brattli auf DHTML-Central ausschließlich mit dieser Art von "onload" arbeitet, und da meckert keiner meiner Brauser.
Wer kann mir helfen? Ich find´s in SelfHTML nicht dokumentiert und auch sonst nirgends. Mache ich was falsch oder muß ich irgendwas beachten, was ich bislang übersehen habe?
servus,
T.
PS.: Die Frage ist nichts für DHTML-Amateure, die auf ihrer Homepage destruktive Tricks feilbieten.
Moin!
<html>
<script type="text/javascript">
<!--
function init2(){
alert('Hello again!');
return "Hallo Welt!";
}
onload2 = init2();
alert (onload2)
//-->
</script>
<h2>Pla!</h2>
</html>
Doch. Jeder Amateur kann das lösen. :)
Ersetze einfach alles, was nach reservierten Schlüsselwörtern riecht.
onload ist ein Ereignis und der IE weigert sich, es als Variable zu behandeln.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Doch. Jeder Amateur kann das lösen. :)
Was denn?
Ersetze einfach alles, was nach reservierten Schlüsselwörtern riecht.
onload ist ein Ereignis und der IE weigert sich, es als Variable zu behandeln.
Ich will´s ja auch als Ereignis, und es ist ja auch eins. Ich will ja nicht das Ergebnis von "init()" ausgeben, sondern er soll seine Funktionskaskade nach dem fertigen Laden starten.
Und das tut er ja auch - aber er soll´s ohne Meckern tun.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
GRRRR 8-(
T. (steht für: Troubadix)
Moin!
Ich will´s ja auch als Ereignis, und es ist ja auch eins. Ich will ja nicht das Ergebnis von "init()" ausgeben, sondern er soll seine Funktionskaskade nach dem fertigen Laden starten.
ok.:
<html>
<script type="text/javascript">
<!--
function init(){
alert('Hello again!');
return "Hallo Welt!";
}
onload = init; /* ohne "()"! */
//-->
</script>
<h2>Pla!</h2>
</html>
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Moin!
<html>
<script type="text/javascript">
<!--
function init2(){
alert('Hello again!');
return "Hallo Welt!";
}
onload2 = init2();
alert (onload2)
//-->
</script>
<h2>Pla!</h2>
</html>
PS.: Die Frage ist nichts für DHTML-Amateure, die auf ihrer Homepage destruktive Tricks feilbieten.
Doch:
Der IE behandelt "onload" offensichtlich als reserviertes Schlüsselwort, Du als Variable. Eine einfache Umbenennung tut ihr Werk.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
Hi,
<script type="text/javascript">
<!--
function init(){
alert('Hello again!')
return
}
onload = init()
Du weist hier das Ergebnis des Funktionsaufrufs zu, obwohl Du die Funktion zuweisen willst.
Weg mit den Klammern.
//-->
</script>
PS.: Die Frage ist nichts für DHTML-Amateure, die auf ihrer Homepage destruktive Tricks feilbieten.
Wie willst Du das beurteilen?
cu,
Andreas
Hi,
Hi auch,
Du weist hier das Ergebnis des Funktionsaufrufs zu, obwohl Du die Funktion zuweisen willst.
Im Prinzip schon klar - aber:
Vor allem verstehe ich nicht, wieso es bei den Scripts von Thomas Brattli (DHTML Central) anstandslos funktioniert, bei mir aber nicht. Und der schreibt´s auch exakt so - weist Deinem Beitrag zufolge also ständig "das Ergebnis eines Funktionsaufrufs zu", obwohl er "die Funktion zuweisen will".
function init(){
alert('Hello again!')
return
}
onload = init()
...und welche Klammern meinst Du gehören da entfernt?
servus,
T.
N'Abend,
ob's was bringt weiß ich nicht, aber ich vermute er meint
onload = init;
MfG
Rouven
ob's was bringt weiß ich nicht, aber ich vermute er meint
onload = init;
Das würde mit Sicherheit zu einer Fehlermeldung führen, weil eine Variable "init" nirgends deklariert ist.
servus,
T.
Moin!
Das würde mit Sicherheit zu einer Fehlermeldung führen, weil eine Variable "init" nirgends deklariert ist.
servus,
T.
Nein!
http://fastix.dyndns.org/tests/onload.html
(Wie war das mit den negativ behafteten?)
fastix®
Nein!
Tatsächlich. Ich staune. Es bleibt aber verwirrend. Denn offenbar liegt es nicht an den Klammern ja oder nein, sondern an der "return"-Anweisung, die Du eingefügt hast.
Mit dieser Anweisung (muß auch etwas enthalten) ist es völlig wurscht, ob Klammern oder nicht. Wenn die Anweisung aber fehlt, verträgt er keine Klammern.
Warum ist das so? Und wo ist eine Sonderfunktion "onload" dokumentiert?
(Wie war das mit den negativ behafteten?)
Wie meinen?
fastix®
T.
Moin!
Tatsächlich. Ich staune. Es bleibt aber verwirrend. Denn offenbar liegt es nicht an den Klammern ja oder nein, sondern an der "return"-Anweisung, die Du eingefügt hast.
Nanü? Ich hatte eine, aber auch mit der der return- Anweisung.
Die schreibe ich fast automatisch rein. Eine Funktion sollte auch was zurückgeben. Sonst ist es keine...
Aber ein "return 0;" genügt vollkommen.
Warum ist das so? Und wo ist eine Sonderfunktion "onload" dokumentiert?
So ist es ein "Ereignis" und die Überwachung wird eingeschaltet.
Ich habs hier gefunden:
http://selfhtml.teamone.de/javascript/beispiele/fensterueberwachen.htm
(Wie war das mit den negativ behafteten?)
Naja... ich war immer noch bei den "Amateuren" mit destruktivem Kram und so weiter.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
BINGOOOO!
Dein Tip auf den unter "Anwendungsbeispiele" in SelfHTML versteckten Hinweis hat mich weitergebracht. Dort ist zwar nur der Javascript-Eventhandler (nicht zu verwechseln mit den Eventhandlern als Attribut in HTML) "onresize" dokumentiert, aber das gab Anregungen zum Selbernachdenken in der richtigen Richtung.
Nach ein bißchen Experimentieren habe ich damit eines meiner größten Probleme lösen können, nämlich die strikte Trennung von HTML- und Javascript-Code. Der Attribut-Eventhandler "<body onload='irgendwas')>" wird damit überflüssig!
Das mag für Euch etwas seltsam klingen, aber für mich ist es von ganz entscheidender Bedeutung. Und diese Eventhandler werden nun mal nirgends ordentlich dokumentiert. Im "offiziellen" Teil von SelfHTML findet sich auch nichts davon.
Danke!
servus,
T.
PS.: Es funktioniert übrigens nur *mit* Klammern :-)
Hi,
onload = init()
Du weist hier das Ergebnis des Funktionsaufrufs zu, obwohl Du die Funktion zuweisen willst.
...und welche Klammern meinst Du gehören da entfernt?
Wieviele Klammern stehen denn bei der Zuweisung?
Wieviele Zuweisungen gibt es in dem Code?
Warum habe ich den Hinweis unter genau der Zeile mit einer der vielen Zuweisungen platziert?
PS.: Die Frage ist nichts für DHTML-Amateure, die auf ihrer Homepage destruktive Tricks feilbieten.
Bist Du sicher, daß Du nicht in genau diese Kategorie gehörst? SCNR ;-)
cu,
Andreas
...und welche Klammern meinst Du gehören da entfernt?
Wieviele Klammern stehen denn bei der Zuweisung?
Ein Klammerpaar, nämlich das, welches einen Funktionsaufruf von einer Variablen unterscheidet.
Wieviele Zuweisungen gibt es in dem Code?
Eine.
Warum habe ich den Hinweis unter genau der Zeile mit einer der vielen Zuweisungen platziert?
Weiß ich nicht. Denn es gibt nur eine Zuweisung: "onload = init()". Wo hast Du andere gesehen, oder was verstehst Du unter einer "Zuweisung". Und da gibt´s nur ein Klammerpaar, das da auch hingehört. Also sag anstelle wolkiger Andeutungen doch bitte klipp und klar, welches Klammerpaar Deiner Meinung nach entfernt gehört und aus welchem Grund.
PS.: Die Frage ist nichts für DHTML-Amateure, die auf ihrer Homepage destruktive Tricks feilbieten.
Bist Du sicher, daß Du nicht in genau diese Kategorie gehörst? SCNR ;-)
Ganz sicher. Nicht so sicher bin ich bzgl. der hiesigen Gepflogenheiten, Zitate aus mehreren Mails in der Antwort auf eine bestimmte Mail ohne Hinweis darauf zusammenzufassen und ob das in Ordnung so ist. Als Forumspräsident weißt Du darauf bestimmt eine Antwort :-)
servus,
T.
Hi,
Ein Klammerpaar, nämlich das, welches einen Funktionsaufruf von einer Variablen unterscheidet.
Oder von einer Funktion.
Weiß ich nicht. Denn es gibt nur eine Zuweisung: "onload = init()".
Wo hast Du andere gesehen, oder was verstehst Du unter einer "Zuweisung".
Wie kommst Du darauf, daß ich andere gesehen hätte?
Und da gibt´s nur ein Klammerpaar, das da auch hingehört.
Das glaubst auch nur Du. Trotz mehrfachen Hinweises (nicht nur durch mich) willst Du nicht verstehen, daß es da nicht hingehört.
Es ist mir ehrlich gesagt zu mühselig, das noch zig mal zu schreiben, rechne also nicht mit weiteren Antworten von mir.
Also sag anstelle wolkiger Andeutungen doch bitte klipp und klar, welches Klammerpaar Deiner Meinung nach entfernt gehört und aus welchem Grund.
Genau das bei der einzigen Zuweisung.
Weil Du nicht das Ergebnis des Funktionsaufrufes, sondern die Funktion selbst zuweisen willst.
Aber das hab ich ja schon mal geschrieben.
Nicht so sicher bin ich bzgl. der hiesigen Gepflogenheiten, Zitate aus mehreren Mails in der Antwort auf eine bestimmte Mail ohne Hinweis darauf zusammenzufassen und ob das in Ordnung so ist.
Wovon sprichst Du? Ich habe von Dir weder eine Mail bekommen (ich leg auch keinen Wert darauf) noch Dir eine geschrieben.
Als Forumspräsident weißt Du darauf bestimmt eine Antwort :-)
Was meinst Du, wieviele Forumspräsidenten gibt es hier?
Wie kommst Du überhaupt darauf, daß es hier überhaupt einen Forumspräsidenten gibt?
Du scheinst ja jeden als Forumspräsidenten zu bezeichnen (siehe unter anderem [pref:t=49453&m=271605])
cu,
Andreas
Wie kommst Du darauf, daß ich andere gesehen hätte?
Hatte wohl übersehen, daß deine "vielen Zuweisungen" ironisch gemeint waren. Sorry, daß ich Dich wörtlich genommen habe. Künftig könnte wohl ein [ironie on/off] derlei Mistverständnisse vermeiden helfen.
Und da gibt´s nur ein Klammerpaar, das da auch hingehört.
Das glaubst auch nur Du. Trotz mehrfachen Hinweises (nicht nur durch mich) willst Du nicht verstehen, daß es da nicht hingehört.
Ich verweise auf meine Antwort an Fastix und will wissen *warum* es da angeblich nicht hingehört. Mit einer befüllten "return"-Anweisung ist es nämlich schnurzpiepegal, ob Klammer oder nicht.
Also sag anstelle wolkiger Andeutungen doch bitte klipp und klar, welches Klammerpaar Deiner Meinung nach entfernt gehört und aus welchem Grund.
Genau das bei der einzigen Zuweisung.
Weil Du nicht das Ergebnis des Funktionsaufrufes, sondern die Funktion selbst zuweisen willst.
Den Grund kenne ich aber imnmer noch nicht (s.o.)
Entweder, ich weise den Wert mit Klammern einer Variablen zu, die ich meinetwegen "daddeldu" nenne, dann sind die Klammern ok, "daddeldu = init;" hat hingegen überhaupt keine Auswirkungen.
Was also ist das besondere an "onload"?
Was meinst Du, wieviele Forumspräsidenten gibt es hier?
1000?
Wie kommst Du überhaupt darauf, daß es hier überhaupt einen Forumspräsidenten gibt?
Ich komme nicht darauf, aber es gibt immer wieder geistige Blockwarte, die sich für sowas halten.
Du scheinst ja jeden als Forumspräsidenten zu bezeichnen (siehe unter anderem [pref:t=49453&m=271605])
Damit warst ja Du gemeint... Wie kann ich nur!
servus,
T.
...in der Hoffnung, doch noch endlich die richtige Antwort auf meine unschuldige Frage zu bekommen
hi,
Ich verweise auf meine Antwort an Fastix und will wissen *warum* es da angeblich nicht hingehört. Mit einer befüllten "return"-Anweisung ist es nämlich schnurzpiepegal, ob Klammer oder nicht.
Vielleicht solltest Du Dich mal mit entsprechenden Dokus beschaeftigen, wenn Du es so genau wissen willst. Die Klammer gehoert nicht "angeblich" sondern "definitiv" da _nicht_ hin. Mit ein bisschen mehr Engagement statt flapsiger Postings - obwohl Du eine korrekte Antwort bekommen hast - waerest Du weiter gekommen.
Merke also:
1. foo() ruft eine funktion.
2. onload=foo; setzt lediglich einen "Zeiger" auf eine Funktion. Der Ruf erfolgt erst, wenn der Event feuert.
Eine verkuerzte Moeglichkeit fuer 2 ist;
onload=function(){alert("foo");}
Alles andere ist Müll, auch wenn es zufaellig in irgendeinem Browser dennoch geht.
Gruss Jo
Vielleicht solltest Du Dich mal mit entsprechenden Dokus beschaeftigen, wenn Du es so genau wissen willst. Die Klammer gehoert
Welche würdest Du mir empfehlen? Am besten wäre etwas online zugängliches.
servus,
T.
Moin!
Vielleicht solltest Du Dich mal mit entsprechenden Dokus beschaeftigen, wenn Du es so genau wissen willst. Die Klammer gehoert
Welche würdest Du mir empfehlen? Am besten wäre etwas online zugängliches.
http://devedge.netscape.com/library/manuals/2000/javascript/1.5/reference/
Kann auch heruntergeladen werden.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®
hi,
Welche würdest Du mir empfehlen? Am besten wäre etwas online zugängliches.
funktioniert google nicht in Deinem Browser?
;-)
z. B. beim Javascript-Erfinder: http://devedge.netscape.com/library/manuals/2000/javascript/1.3/guide/
Gruss Jo
hi,
funktioniert google nicht in Deinem Browser?
Doch doch. Aber das, was ich brauche, finde ich dort nicht - jedenfalls nicht so, wie ich es brauche.
z. B. beim Javascript-Erfinder: http://devedge.netscape.com/library/manuals/2000/javascript/1.3/guide/
Sehr schön. Problem dabei: mein "technisches" Englisch ist so doll nicht... Gibt´s nicht was Deutsches, welches was anderes behandelt als Mouseover-Spielchen und herumhüpfende Menüs?
Gruss Jo
Ebenso,
Tho
Hallo Thomas,
Was meinst Du, wieviele Forumspräsidenten gibt es hier?
1000?
Eben. Jeder ist sein eigener Präsident.
Wie kommst Du überhaupt darauf, daß es hier überhaupt einen Forumspräsidenten gibt?
Ich komme nicht darauf, aber es gibt immer wieder geistige Blockwarte, die sich für sowas halten.
Tut es Not, gleich »Faschist« zu schreien, wenn man sich ungerecht behandelt fühlt, vor allem dann, wenn man auf die geltenden Vereinbarungen hingewiesen wird, über welche offensichtliche Unkenntnis vorliegt?
Andere Frage: Welche Verbindung besteht zwischen Präsidenten und Blockwarten?
M.
Hallo Thomas,
Hi,
Ich komme nicht darauf, aber es gibt immer wieder geistige Blockwarte, die sich für sowas halten.
Tut es Not, gleich »Faschist« zu schreien, wenn man sich ungerecht behandelt fühlt, vor allem dann, wenn man auf die geltenden Vereinbarungen hingewiesen wird, über welche offensichtliche Unkenntnis vorliegt?
Tu ich ja gar nicht. Also sagen wir "Hausmeister" :-)
Und das mit den "geltenden Vereinbarungen": Sorry, für mich war und ist das ein Themenwechsel gewesen.
Andere Frage: Welche Verbindung besteht zwischen Präsidenten und Blockwarten?
Präsidenten präsidieren, will heißen "sitzen vor". Hausmeister laufen rum.
Ich "sitze vor" meinem Bildschirm. Dahinter "laufen welche rum".
Geht´s Dir nicht auch so?
servus,
T.
Die Lösung ist gefunden und ich gehe jetzt schlafen!
Ein Oskar für fastix, der mich auf die richtige Spur gebracht hat!
servus,
T.