从setTimeout调用时,window.event失败

时间:2013-09-04 17:27:44

标签: javascript events settimeout

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

function checkForShift() {
    if (window.event.shiftKey) {
        alert('Shift key detected, aborting');
        return false
    }
    else {
        //do stuff
    }
}

除非我从setTimeout()函数调用checkForShift(),否则这很有用。像这样:

setTimeout ( "checkForShift()" , 500 );

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

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

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

3 个答案:

答案 0 :(得分:2)

该事件仅在事件发生时有效(并且不使用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 );

答案 1 :(得分:1)

event回调中没有window.eventsetTimeout。您必须使用onkeydownonkeyup自行检测shift键。

// 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);

答案 2 :(得分:1)

事件处理周期完成后,浏览器引擎将删除event个对象。

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

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

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