出于某种目的,我想在一个变量中缓存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时,所有以前的属性都会被后一个属性覆盖?
我是对的吗?答案 0 :(得分:1)
注:
如果您设置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)
}
上查看
编辑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)
}
答案 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中的
答案 2 :(得分: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秒后它不可用,因此您可以使用闭包。