先看下面的popup中事件处理示例,再来说是什么问题:
































这个示例中,分别使用了两种方法来添加事件处理函数。对于attachEvent这种方式,我在' 使用Popup窗口创建无限级Web页菜单(3)'一文中介绍过它的用法,而且说明了怎么在其处理函数中获取全局事件变量 event。就是被attach的处理函数的第一个参数即是默认的 event变量。
今天我无意中使用了另一种方法,向 事件处理回调赋值的方法附加事件处理函数,div.onclick = function()。却发现了一个popup窗口中响应时间处理函数的缺陷。执行上面的代码,我们会发现NormalEventListener()方法的elmt参数是引发事件的元素本身的引用,而此时调用 event属性,却发现 event这厮居然是:null

原来NoramlEventListener()中的 event是window. event,因为这个函数定义在IE的window的作用域内,它的引用也可以写成window.NormalEventListener(),而我们触发的事件是在popup窗口中的window中。就是说IE的window和popwin.document.parentWindow是两个不同的域,当然这个时候window. event就是null了。解决这个问题的办法有两个,一可以去取popwin.document.parentWindow的 event,不过这个方法比较麻烦,需要专门去记录那个popwin变量。另外还有一个最简单的方法可以取到正确的 event属性。因为每个事件触发的源元素(srcElement)和触发它的事件属性总是在同一个域中,所以我们就可以使用如下办法将其取到:






这个elmt参数是从Click函数中传递过来的触发事件的元素本身,即: event.srcElement。