Hallo apfelsine,
dass der alert kommt, ist logisch. Das Problem wird deutlicher, wenn man den Code noch etwas erweitert.
$(document).ready()
{
alert("Yahoo!");
$("#foo").on("click", function() { /* some handler */ });
}
- Aufruf der ready-Funktion auf dem wrapped set um das document Objekt, ohne Übergabe eines Parameters. D.h. du sagst jQuery: Registriere bitte ein NICHTS als ErrorHandler. Ok. Tut es. Fertig. Oh, da fehlt ein Semikolon! Macht nichts. JavaScript verzeiht es Dir (einer der häßlichsten Schwachpunkte von JavaScript, den man ihm selbst im strict mode nicht abgewöhnen kann).
- Nun kommt ein Statement-Block, bestehend aus dem Aufruf der alert-Funktion, und einer qQuery Eventregistrierung. Da dieser Block kein if oder so vor sich hat, werden die Statements darin ausgeführt, und zwar genau an der Stelle, wo er geschrieben ist. HTML, dass nach ihm folgt, hat sich der Browser noch keines Blickes gewürdigt. Eine Blockbildung dieser Art ist syntaktisch erlaubt, wenn auch sinnlos in älterem JavaScript. In neuerem JavaScript (ES6) könnte man darin lokale Variablen kapseln (let Befehl).
D.h. der alert() wird problemlos ausgeführt. Ob die Eventregistrierung funktioniert, hängt davon ab, wo der Script-Block steht. Befindet er sich unterhalb des Elements mit id="foo", funktioniert er. Befindet er sich oberhalb (z.B. im head), liefert $("#foo") ein leeres wrapped set. Eine jQuery-Funktion, die auf einem leeren wrapped set aufgerufen wird, tut einfach gar nichts.
Rolf
--
Mimosen sind grün
Mimosen sind grün