Javascript 从setTimeout调用window.event时失败

Javascript 从setTimeout调用window.event时失败,javascript,events,settimeout,Javascript,Events,Settimeout,我有一个页面,它将根据cookie的值执行操作。当页面加载时,我想通过按住shift键来停止这些操作 function checkForShift() { if (window.event.shiftKey) { alert('Shift key detected, aborting'); return false } else { //do stuff } } 这非常有效,除非我从setTimeout()函数调用

我有一个页面,它将根据cookie的值执行操作。当页面加载时,我想通过按住shift键来停止这些操作

function checkForShift() {
    if (window.event.shiftKey) {
        alert('Shift key detected, aborting');
        return false
    }
    else {
        //do stuff
    }
}
这非常有效,除非我从setTimeout()函数调用checkForShift()。像这样:

setTimeout ( "checkForShift()" , 500 );
在这种情况下,500毫秒后调用checkForShift()函数,但下一行失败并显示以下消息:

Unable to get property 'shiftKey' of undefined or null reference

为什么从setTimeout()调用时未定义它?

没有
事件
窗口。事件
来自
setTimeout
回调。您必须使用
onkeydown
onkeydup
自行检测换档键

// Modified version of dystroy's code
var shiftKeyDown = false;
function setShift(e) {
    e = e || window.event; // For IE < 9
    shiftKeyDown = !!e.shiftKey;
}
function checkForShift() {
    if (shiftKeyDown) {
        alert('Shift key detected, aborting');
    } else {
        //do stuff
    }
}
window.onkeydown = window.onkeyup = setShift;
setTimeout(checkForShift, 500);
//dystroy代码的修改版本
var shiftKeyDown=错误;
功能设置换档(e){
e=e | | window.event;//对于IE<9
shiftKeyDown=!!e.shiftKey;
}
函数checkForShift(){
如果(shiftKeyDown){
警报(“检测到Shift键,正在中止”);
}否则{
//做事
}
}
window.onkeydown=window.onkeydup=setShift;
设置超时(checkForShift,500);

没有
事件
窗口。事件
来自
设置超时
回调。您必须使用
onkeydown
onkeydup
自行检测换档键

// Modified version of dystroy's code
var shiftKeyDown = false;
function setShift(e) {
    e = e || window.event; // For IE < 9
    shiftKeyDown = !!e.shiftKey;
}
function checkForShift() {
    if (shiftKeyDown) {
        alert('Shift key detected, aborting');
    } else {
        //do stuff
    }
}
window.onkeydown = window.onkeyup = setShift;
setTimeout(checkForShift, 500);
//dystroy代码的修改版本
var shiftKeyDown=错误;
功能设置换档(e){
e=e | | window.event;//对于IE<9
shiftKeyDown=!!e.shiftKey;
}
函数checkForShift(){
如果(shiftKeyDown){
警报(“检测到Shift键,正在中止”);
}否则{
//做事
}
}
window.onkeydown=window.onkeydup=setShift;
设置超时(checkForShift,500);

事件仅在发生时有效(不要使用
window.event
,而是提供给事件处理回调)

要正确实现所需,必须通过检测状态的更改来存储状态:

var shiftKeyDown = false;
window.onkeydown = function(e){
    shiftKeyDown = !!(e||window.event).shiftKey;
}
window.onkeyup = function(){
    shiftKeyDown = false;
}
function checkForShift() {
    if (shiftKeyDown) {
        alert('Shift key detected, aborting');
    } else {
        //do stuff
    }
}
调用
setTimeout
时,不要传递字符串,而是传递函数:

setTimeout (checkForShift , 500 );

事件仅在发生时有效(并且不使用
window.event
,而是将其提供给事件处理回调)

要正确实现所需,必须通过检测状态的更改来存储状态:

var shiftKeyDown = false;
window.onkeydown = function(e){
    shiftKeyDown = !!(e||window.event).shiftKey;
}
window.onkeyup = function(){
    shiftKeyDown = false;
}
function checkForShift() {
    if (shiftKeyDown) {
        alert('Shift key detected, aborting');
    } else {
        //do stuff
    }
}
调用
setTimeout
时,不要传递字符串,而是传递函数:

setTimeout (checkForShift , 500 );

事件处理循环完成后,浏览器引擎将删除
事件
对象

由于
setTimeout
始终是异步的,因此事件对象不再可用

此外,
window.event
属性不是跨浏览器的。您应该为此使用事件库或编写自己的跨浏览器事件包装器

function (e) {
    if (!e) { e = window.event; }
    // do whatever you want with event object
}

事件处理循环完成后,浏览器引擎将删除
事件
对象

由于
setTimeout
始终是异步的,因此事件对象不再可用

此外,
window.event
属性不是跨浏览器的。您应该为此使用事件库或编写自己的跨浏览器事件包装器

function (e) {
    if (!e) { e = window.event; }
    // do whatever you want with event object
}

如何正常调用
checkForShift
?如何正常调用
checkForShift
?您说过不要使用
窗口。事件
,但您使用了它@胡安曼德斯:那显然是个打字错误。Fixed.e参数不适用于所有浏览器。你需要跨浏览器检查它。简单问题。。。艾美?你可能猜到了。据我所知,跨浏览器的方式是做
函数处理程序(e){e=e | | window.event}
。我相信IE9是第一个不需要
窗口的。event
你说不要使用
窗口。event
但是你使用了它@胡安曼德斯:那显然是个打字错误。Fixed.e参数不适用于所有浏览器。你需要跨浏览器检查它。简单问题。。。艾美?你可能猜到了。据我所知,跨浏览器的方式是做
函数处理程序(e){e=e | | window.event}
。我相信IE9是第一个不需要
window.event