2012-08-08 2 views
3

나는 비교적 자바 스크립트에 새로운 것이므로 제발 저를 들어주세요.자바 스크립트의 실행 순서와 관련된 문제

사용자에게 기본 메뉴의 하위 메뉴에 도달하는 데 약간의 시간을 줄 수있는 약간의 코드가 있습니다. 제 문제는 코드가 이상한 순서로 계속 실행된다는 것입니다. 여기

는 코드 다음 hoverCheck 기능이 실행되기 전에

function onFocusOut() { 
    var tester = 0; 
    setTimeout(function(){menuReset(tester)},1000); 
} 

function menuReset(tester) {  
    var hoverCheck = function (event) { 
     alert("#navBase a has focus"); //is fired, but to late... 
     var tester = event.data.varTester; 
     var tester = 1; 
    }; 

    jQuery('#navBase').on('mousemove', 'a', { varTester: tester }, hoverCheck); 
    jQuery('#navBase').off('mousemove', 'a', { varTester: tester }, hoverCheck); 

    alert(tester); //This keeps firing first, before the alert in hoverCheck 

    if(tester == 1){ 
     alert("tester = 1"); 
     return; 
    } 

    else { 
     jQuery('#navBase ul').hide(); 
     jQuery('#navBase').css({'width': ''}); 
     jQuery('#navBaseAnchor').css({ 
      'width': '', 'color': '', 
      'font-size': '', 
      'border-bottom-style': '', 
      'border-bottom-width': '', 
      'border-bottom-color': ''}); 

     tester = 0; 
    } 
} 

가 지금은 (1 "테스터"를 설정해야 함), "테스터는"0이라는 경고를 받고 유지하고 내 경고를 발생 그 기능.

누군가 내가 뭘 잘못하고 있다고 말할 수 있습니까?

답변

0

alert(tester)은 사용자로 확인되는 코드를 실행하는 첫 번째 코드 줄입니다. jQuery().on()jQuery().off()의 두 함수 호출은 이벤트 처리기 만 연결합니다. 경고에 "1"을 표시하려면 hoverCheck이 실행되기 전에 마우스를 빠르게 움직여야합니다. 하지만 아마도 JavaScript가 다음 줄에 도달하는 것보다 더 빨리 손을 움직일 수는 없습니다. alert()tester이고 "0"입니다.

+0

아하, 고마워. 나는 지금 며칠 동안이 일을 해왔다. 실제로 시장이 돌아왔다. ... 요소가 현재 맴돌고 있는지 확인하는 또 다른 방법을 알고 있니? (전체 하위 메뉴 혼란을 dicarting의 시점에서 momenteraly) – Marcelcolt

+0

음 ... 나는 물론 discarting 의미. 나는 mouseenter, mouseover, mousemove, mousein에 이르기까지 무엇이든 시도했다. 그리고 나는 그것이 초점이 아니라는 것을 안다. .. – Marcelcolt

1

JS도 상당히 익숙하지만 가변 범위 오류도주의해야합니까?

onFocusOut()menuReset(tester)에 로컬로 tester을 선언 한 다음이를 전역 외부 변수라고합니다.

  • LOCAL answers.oreilly.com에서 - 함수에 특정과 만 작업을하는 것들이다.
  • GLOBAL - 함수 내에서 정의되지 않은 것이고 변수가 변수가 필요하지 않으면 기능을 수행 할 수도 있습니다.
+1

처음에는 실제로 전역 적으로 호출했지만 hoverCheck()에 전달되지 않았기 때문에 로컬로 전달하는 것으로 시작되었습니다. – Marcelcolt

1

신경 끄시 사람들 ... 나는 모든 주위에 방법을 찾아 냈다. 현재 mouseOver에 관련된 앵커에 .focus()을 설정하고 있습니다. (물론 blur()mouseleave입니다.) 그러면 document.activeElement을 사용하여 현재 포커스 된 요소를 쉽게 확인할 수 있습니다.

그래서 문제가 해결되었습니다. 약간 다른 방식으로 해결되었습니다.

-1

약간 다른 접근 방식은 특정 조건이 충족되지 않으면 특정 시간 후에 하위 메뉴가 사라지도록 Javascript timeout()을 설정하는 것입니다.

체크 아웃 this JSFiddle example

행운을 빕니다!

+1

위의 초기 코드를 체크 아웃했거나 체크 아웃하지 않았을 수도 있습니다. 문제는 당신이 언급 한 조건이 "떠돌아 다니는"것이 었습니다. 요소는 ** 당장 ** 포착됩니다. 호버 - 부분에 대한 해결 후 나는 여전히 타임 아웃을 사용한다. – Marcelcolt