2013-10-15 4 views
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 (result); console.log (isPressed) // 키를 눌렀지만 1로 변경되었지만 0이 출력됩니다.범위 지정 문제 자바 스크립트

if 루프 내부에서 console.log (isPressed)를 수행하면 작동합니다. 내가 알지 못하는 범위 문제입니다. 도와주세요.

미리 감사드립니다.

+3

이것은 범위 지정과는 아무 관련이 없습니다. 이벤트 핸들러 밖의'console.log (isPressed)'는 키 누르기 전에 실행되며이 코드는 나에게 이해가되지 않습니다 ..'if'는 루프가 아니므로 조건식입니다. 키를 누른 후에 무언가를하려면 이벤트 핸들러에서 수행하거나 이벤트 핸들러에서 해당 액션을 호출하십시오. – PSL

+0

@PSL 감사합니다. 코드와 관련하여 설명 할 수 있습니까? –

답변

1

문제는 동기화 중 하나입니다. 키를 누를 때

이 하나

isPressed를 설정 한 첫 번째 명령은 단지 나중에에 무슨 일이 일어날 말한다 isPressed

의 값을 보여줍니다 귀하의 코드는 다음과 같이 읽기 시간이 지나면 완료됩니다. 어떤 키를 누르면 전에 두 번째 명령은 즉시 다음, 그래서 보여줍니다 0 당신은 세 번째 명령을 수행하는 경우 :

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

을 (3 초 통과하기 전에) 당신을 페이지로드 후 키 오른쪽으로 눌러 isPressed이 1로 설정된 로그를 보게됩니다.

키를 누른 후에 실행해야하는 추가 논리가있는 경우 "Do your stuff here"주석에 배치해야합니다.

자바 스크립트가 비동기 적으로 처리되는 이벤트의 개념이 :

+0

고마워. 그래서 내 목표는 어떤 키가 창에서 눌 렸는지 확인하고 키를 눌렀을 때 isPressed 이벤트를 1로 설정하는 것이다. 최종 결과물은 다음과 같다. 결과 변수는 isPressed의 값. –

+1

"키를 눌렀는지 확인하십시오."-> 언제 알아야합니까? – Tibos

+0

코드에 결과 변수를 추가했습니다. 감사합니다. –

1

는 여기 console.log의 그들이 무엇을 출력하는 이유에 대한 핵심 대답. onkeypress 이벤트를 사용할 때이를 활용합니다.

나머지 JS 파일은 이벤트 설정을 포함하여 수행해야하는 작업을 수행 한 다음 이벤트가 발생하면 (키를 누름으로써) 코드를 실행합니다. 실제로

은 JS 파일은이 일을한다 :

  1. 변수 isPressed0에 설정합니다.
  2. 이 익명 함수가 onkeypress으로 설정됩니다.
  3. 로그 isPressed을 콘솔에 기록하십시오. onkeypress 실제로 발생할 때마다
  4. 은의 우리가 단계에서 설정 한 익명 기능을 실행할 수 있도록 2.

3 단계, 당신은 실제로 isPressed 변수에 아무 짓도하지 않은, 그래서 0로 로그인하는 것 도달 .

나중에 onkeypressed을 실행하면 실제로 isPressed의 값이 변경되므로 1으로 기록됩니다.


는 또한 익명 함수가 onkeypress에 바인딩 특히 isPressed을 반환하지 않는 것을 염두해야한다.하단에 return isPressed을 추가해야합니다 (해당 설명이있는 곳).

이것은 익명의 함수로 이벤트에 묶여 있기 때문에 그렇게할만한 이유가 없습니다. 값은 어디에도 적용되지 않으며 isPressed 변수를 조작하려는 경우 설정 한 범위 지정이 이상적입니다.

+0

@ EvanSiegel.Alave 내 코드를 변경했습니다. 결과 변수는 내가 액세스하려고하지만 여전히 값은 0입니다. 고마워요. –

+0

@SwarajChhatre, 이벤트가 시작되기 전에 여전히 'result' 변수를 설정하고 있습니다. 이벤트 함수의 내부에 넣으면 올바르게 설정됩니다. 자바 스크립트는 파일에 쓰는 순서대로 실행되지 않습니다. 상황이 진행되고 있음을 다시 한번 살펴보십시오. –