2

出于某种目的,我想将 Window.Event 对象缓存在一个变量中并稍后使用它,但 MSIE 一直告诉我这是“未知”。

只需在 IE 中运行下面的代码,您就会明白我的意思

我只想问怎么会这样?我错过了什么?

html:

<button id='btn'>Click!!!</button>

JS:

    var eventObj = null;
    document.getElementById('btn').onclick = function() {
       eventObj = window.event;
       setTimeout(function() {
          alert(typeof eventObj.srcElement);
       }, 1000)
    }​

EIDT 1:

我已经搜索了其他人完成的一些测试,请参见以下内容:

HTML:

<button id='btn1'>Click 1 !!</button>
<button id="btn2">Click 2 !!</button>

JS

var btn1EventObj = null;
document.getElementById('btn1').onclick = function() {
    btn1EventObj = window.event;
    alert(btn1EventObj.srcElement.id);
}
document.getElementById('btn2').onclick = function() {
    alert(btn1EventObj === window.event); // output:false;
    alert(btn1EventObj.srcElement === window.event.srcElement); // output: true ; 
    alert(btn1EventObj.srcElement.id); // output: btn2 ;
}

当 btn1 被单击时,我假设我将“事件对象”缓存在btn1EventObj中,然后单击 btn2:

测试:

btn1EventObj === window.event -> false; // MSIE 中不仅有一个事件对象

btn1EventObj.srcElement === window.event.srcElement -> true //我无法理解下面的这个。

btn1EventObj.srcElement.id -> btn2

小提琴

所以以上所有告诉我,也许MSIE中引发的所有事件都是共享属性,当点击btn2时,前面的所有属性都被后面的属性覆盖?

我说得对吗?

4

3 回答 3

1

`window.event' 是一个全局对象,可以在每个引发的事件上更改。在几毫秒内在浏览器上引发了许多事件。

笔记:

如果您设置var y = someObject对象没有复制到y变量中,则该y变量只包含内存中对象的地址(您可以谷歌一下:对象引用和指针)。所以您需要将对象复制到y,或尝试以下替代解决方案:

所以你需要使用function(e){}样式事件处理程序:

var eventObj = null; 
document.getElementById('btn').onclick = function(e) { 
   eventObj = e;
   setTimeout(function() { 
      alert(typeof eventObj.srcElement); 
   }, 1000) 
} 

在jsfiddle上看到这个

编辑1:

在 M$ IE 中,您可以使用以下代码:

function copyObject(o){
    return {srcElement: o.srcElement,
           ...
           more attributes ...
            };
}

var eventObj = null; 
document.getElementById('btn').onclick = function(e) { 
   eventObj = copyObject(window.event);
   setTimeout(function() { 
      alert(typeof eventObj.srcElement); 
   }, 1000) 
} 

参见jsfiddle(已编辑)

于 2012-07-14T09:52:24.427 回答
1

您不能复制window.eventIE 中实际事件的上下文。换句话说:在脚本中分配处理程序时不存在现有事件。如果要引用window.event,则必须内联分配处理程序。

MSDN:

The event object is available only during an event—that is,
you can use it in event handlers but not in other code.

HTML:

<button id='btn' onclick="clicker(event);">Click!!!</button>

和JS:

function clicker(e){
    setTimeout(function (){
        alert(e.srcElement);
    },1000);
    return;
}

event在 MSDN 中。

于 2012-07-14T10:12:26.910 回答
0
var eventObj = null;
document.getElementById('btn').onclick = function() {
   eventObj = window.event;
   setTimeout((function(eventObj) {
      alert(typeof eventObj.srcElement);
   })(eventObj), 1000)
}

演示。

事件对象仅在事件期间可用-也就是说,您可以在事件处理程序中使用它,但不能在其他代码中使用setTimeout它,因此在事件执行后它不可用,因为为了避免冲突,IE 将其设置为 null 和之后1 秒不可用,因此您可以使用闭包。

于 2012-07-14T10:40:21.333 回答