2

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

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

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

setTimeout ( "checkForShift()" , 500 );

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

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

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

4

3 回答 3

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 );
于 2013-09-04T17:32:03.357 回答
1

没有eventwindow.event来自setTimeout回调。您必须使用onkeydownand自行检测 shift 键onkeyup

// 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);
于 2013-09-04T17:31:51.427 回答
1

event当事件处理周期完成时,浏览器引擎正在删除一个对象。

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

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

function (e) {
    if (!e) { e = window.event; }
    // do whatever you want with event object
}
于 2013-09-04T17:32:10.920 回答