0
var isPressed =0;
document.body.onkeypress = function(evt)
{
  evt = evt || window.event;

    if (evt.keyCode!=='undefined') {
        // Do your stuff here
        isPressed = 1;
        console.log(isPressed);//Here it gives 1
    }
//return isPressed;
}
result = navigator.appVersion +"|"+n+"|"+getStyle(mydiv,'opacity')+"|"+history.length+"|"+metarefesh+"|"+hasFocus+"|"+navigator.platform+"|"+parent.top.document.referrer+"|"+activexenable+"|"+javaEnabled+"|"+hasFlash+"|"+navigator.plugins.length+"|"+ hasMouseMoved+"|"+isClicked +"|"+**isPressed**+"|"+isresized+"|"+isScrolled+"|"+getStyle(mydiv,'zIndex');

console.log(結果); console.log(isPressed)//キーを押して 1 に変更されたにもかかわらず、これは 0 を返します。

問題の if ループ内で console.log(isPressed) を実行すると、うまくいきます。私が認識していないスコープの問題です。助けてください。

前もって感謝します

4

2 に答える 2

1

問題は同期の 1 つです。コードは次のように読み取られます。

キーが押されたとき、isPressed1に設定

の値を表示isPressed

最初の指示は、後の時点で何が起こるかを示すだけで完了します。2 番目の命令は、いずれかのキーが押される前の直後に続くため、0 が表示されます。3 番目の命令を実行する場合:

window.setTimeout(function(){console.log(isPressed)}, 3000);

ページの読み込み直後 (3 秒が経過する前) にキーを押すと、isPressed1 に設定されたログが表示されます。

キーが押された後に実行する必要がある追加のロジックがある場合は、「Do your stuff here」というコメントに配置する必要があります。

于 2013-10-15T15:06:26.830 に答える
1

console.logこれらの s がそれらが何であるかを出力している理由に対する主な答えは次のとおりです。

JavaScript には、非同期的に処理されるイベントという概念があります。イベントを使用するときにこれを活用しますonkeypress

JS ファイルの残りの部分は、必要なこと (イベントの設定を含む) を実行し、(キーを押すことによって) イベントが発生すると、内部のコードを実行します。

実際には、JS ファイルはこれを行っています。

  1. 変数isPressedを に設定します0
  2. この匿名関数を occur に設定しonkeypressます。
  3. isPressedコンソールにログインします。
  4. 実際に発生するたびonkeypressに、ステップ 2 で設定した無名関数を実行しましょう。

isPressedステップ 3 に到達すると、実際には変数に対して何もしていないため、 としてログに記録され0ます。

後で発火onkeypressedすると、実際には の値が変更isPressedされるため、 としてログに記録され1ます。


また、バインドされた無名関数onkeypressが特に を返さないことに注意する必要がありますisPressedreturn isPressed一番下(そのコメントがある場所)に追加する必要があります。

これはイベントにバインドされた無名関数であるため、これを行う正当な理由はありません。isPressed値はどこにも行きません。変数を操作したい場合は、設定したスコープが理想的です。

于 2013-10-15T15:11:08.903 に答える