我有一个页面会根据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()调用时未定义?
答案 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.event
或setTimeout
。您必须使用onkeydown
和onkeyup
自行检测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
}