出于某种目的,我希望将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 ;
}
单击btn1EventObj,后,我假设我在btn1中缓存‘’,然后单击btn2:
测试:
btn1EventObj === window.event -> false; // MSIE中不仅存在一个事件对象
btn1EventObj.srcElement === window.event.srcElement -> true // I无法理解下面的内容。
btn1EventObj.srcElement.id ->btn2
见小提琴
所以,以上所述都告诉我,在MSIE中引发的所有事件都是共享属性,当单击btn2时,前面的所有属性都会被后面的属性覆盖?
我说得对吗?
发布于 2012-07-14 02:12:26
在IE中,不能将window.event
从实际事件的上下文中复制出来。换句话说:当您在脚本中分配处理程序时,没有存在的事件。如果要引用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>
和联合来文:
function clicker(e){
setTimeout(function (){
alert(e.srcElement);
},1000);
return;
}
MSDN中的event
。
发布于 2012-07-14 01:52:24
`window.event‘是一个全局对象,可以在引发的每个事件上进行更改。许多事件在毫秒内在浏览器上引发。
注意:
如果您将对象设置为var y = someObject
y
对象没有复制到y
变量中,则 y
变量只包含内存中对象的地址(您可以在google上搜索对象引用和指针).so,您需要将对象复制到 y
,或者尝试下面的替代解决方案:E 221
因此,您需要使用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)
}
发布于 2012-07-14 02:40:21
var eventObj = null;
document.getElementById('btn').onclick = function() {
eventObj = window.event;
setTimeout((function(eventObj) {
alert(typeof eventObj.srcElement);
})(eventObj), 1000)
}
事件对象仅在事件期间可用--也就是说,您可以在事件处理程序中使用它,但不能在其他代码中使用它,而且您正在使用setTimeout
,因此在执行事件之后它是不可用的,因为为了避免冲突,IE将其设置为null,在1秒后不可用,因此可以使用闭包。
https://stackoverflow.com/questions/11482691
复制