MSIE如何提醒'未知'?

时间:2012-07-14 09:43:33

标签: javascript html internet-explorer events

出于某种目的,我想在一个变量中缓存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 中缓存'event object',然后点击btn2:

测试:

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

btn1EventObj.srcElement === window.event.srcElement - &gt;是的 //我无法理解下面这个。

btn1EventObj.srcElement.id - &gt; btn2

请参阅fiddle

所以以上所有告诉我,在MSIE中引发的所有事件都可能都是共享属性,当点击btn2时,所有以前的属性都会被后一个属性覆盖?

我是对的吗?

3 个答案:

答案 0 :(得分:1)

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

注:

如果您设置var y = someObject对象未被复制到y变量中,则y变量只包含内存中对象的地址(您可以google about:object引用和指针)。所以你需要将对象复制到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(Edited)

答案 1 :(得分:1)

您无法将window.event复制到IE中实际事件的上下文之外。换句话说:在脚本中分配处理程序时,没有现有事件。如果要引用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;
}
MSDN中的

event

答案 2 :(得分:0)

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

DEMO.

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