在立即执行的函数中获取"event"对象?

Kal*_*nin 0 javascript event-handling javascript-events

我以这种方式使用事件委托:

elWraper.onclick = (function(){
    //how to get here "event" object
    e = e || window.event;
    var t = e.target || e.srcElement;

    //event handler
    return function(){
        //manipulations with "t" variable
    }
})();
Run Code Online (Sandbox Code Playgroud)

如何在立即执行的函数中获取"事件"对象?

sle*_*man 10

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
    }
})();
Run Code Online (Sandbox Code Playgroud)

在符合标准的浏览器中,事件对象是传递给回调函数的第一个参数.在IE中,它是一个全局变量(这e = e || window.event是试图确定的).因此,您返回的函数immediately executed function应该接受声明为其第一个(通常是唯一的)参数的事件对象.


澄清

由于人们在想(也许他们想知道为什么OP接受了这个答案),因此OP的问题并不清楚这一点.一种是创建一个变量的闭包来跟踪某些东西:

/* 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 ...
    }
})();
Run Code Online (Sandbox Code Playgroud)

另外,这是在循环中分配事件处理程序的经典方法:

/* 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);
}
Run Code Online (Sandbox Code Playgroud)

或者也许OP只是认为他可以"缓存"事件对象而错误地认为他可以用它来做这件事.在这种情况下,阅读我的解释(而不仅仅是代码)应该启发读者为什么这是一个坏主意.