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

コールバックはありませeventん。と を使用して、自分でシフト キーを検出する必要があります。window.eventsetTimeoutonkeydownonkeyup

// 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 に答える