то, что у вас есть, является избыточным и фактически вызывает бесконечный цикл. по сути, это функция, вызывающая себя. современные JIT-компиляторы могут пойти «да, вы, вероятно, не хотели этого делать» и прервать цикл, но IE7 / 8, скорее всего, просто запустит его как написано
в основном, существует разница между обратным вызовом, добавленным addEvent
, который срабатывает при собственном срабатывании события, и ручным отключением обратного вызова (fireEvent
).
позже - если вы сделали $("field").fireEvent("focus")
- он просто запустит код в связанной функции. это не будет на самом деле сосредоточиться на поле. Родной $("field").focus();
будет делать ОБА.
предостережение при использовании fireEvent
- это когда ваш обратный вызов пытается что-то сделать с самим событием. например, в этом коде:
el.addEvent("click", function(e) {
e.stop();
// do something
});
// later...
el.fireEvent("click"); // exception as e is not defined and stop is not a function
Чтобы обойти это, вам нужно проверить, определен ли аргумент e
и определен ли stop в обратном вызове:
el.addEvent("click", function(e) {
e && e.stop && e.stop();
// do something
});
или вы можете передать фиктивный объект в fireEvent:
el.fireEvent("click", {
stop: Function.from
});
или даже ...
el.fireEvent("click", new DOMEvent()); // 1.4+, new Event() before....
Не уверен, что это поможет, поскольку у вас было много лишних в вашем «вопросе», но это может дать вам представление о том, как используются события.
веселись