elWraper.onclick = (function(){
// misc stuff here
//event handler
return function(e){
e = e || window.event;
var t = e.target || e.srcElement;
//manipulations with "t" variable
}
})();
В браузерах, соответствующих стандартам, объект события является первым параметром, переданным в функцию обратного вызова.В IE это глобальная переменная (которую пытается определить e = e || window.event
).Поэтому функция, которую вы возвращаете с помощью immediately executed function
, должна принимать объект события, объявленный в качестве первого (и обычно единственного) аргумента.
Уточнение
Поскольку люди задаются вопросом (и, возможно, им интересно, почему ОП принял этот ответ), для этого есть способы, которые не ясны из вопроса ОП.Одним из них является создание замыкания на переменную для отслеживания чего-либо:
/* Count number of clicks,
* WITHOUT USING GLOBAL VARS!
*/
el.onclick = (function(){
var counter = 0;
return function(e){
e = e || window.event;
var t = e.target || e.srcElement;
counter ++;
alert('detected '+counter+' clicks!');
// do stuff with t or e ...
}
})();
Кроме того, это классический способ назначения обработчиков событий в циклах:
/* Use double closure to break closure in loop!
*/
for (var i=0; i<stuff.length; i++) {
var el = stuff[i];
el.onclick = (function(x){
return function(e){
e = e || window.event;
var t = e.target || e.srcElement;
alert(x);
// do stuff with t or e ...
}
})(i);
}
Или, возможно, OP простоОн думал, что может «кэшировать» объект события, и ошибочно полагал, что может использовать это для этого.В этом случае чтение моего объяснения (а не только кода) должно просветить читателя, почему это будет плохой идеей.