2012-06-08 2 views
0

일반적으로 setTimeout() 메소드의 실행은 setTimeout() 메소드 외부에있는 clearTimeout() 메소드로 중단되지만, 제 상황에서는 중단해야합니다. 지정된 "대기 기간"동안 특정 이벤트가 발생하면 루프 자체 내에서 setTimeout() 루프를 실행합니다.setTimeout() 함수 내에서 clearTimeout() 액션을 시뮬레이트합니다.

아래에 표시된 내 코드에서 사용자는 코드 A를 활성화하기 위해 500 밀리 초를 얻습니다. 코드 프레임이 시간 프레임 내에 활성화되지 않으면 코드 B가 대체로 실행됩니다. 코드 A에서 나는 1) 제한 시간을 멈추게 할 곳과 2) 기능을 종료하고 싶은 곳이라는 두 곳을 표시했습니다.

jsFiddle is here.

내 자바 스크립트와 HTML 코드의 사본은 다음과 같습니다

HTML

<table id="headMenu"> 
    <tr> 
     <td id="head1">Item 1</td> 
     <td id="head2">Item 2</td> 
     <td id="head3">Item 3</td> 
    </tr> 
</table> 
<table id="subMenu"> 
    <tr> 
     <td>Dynamic Content!</td> 
    </tr> 
</table​​​​​​​​​​​​​​​​​​​​​​​​​​​​>​​​ 

자바 스크립트

a = 500; 
document.getElementById("head1").onmouseover = function(displayMenu) { 
    document.getElementById("subMenu").innerHTML = "<tr><td>Item A</td><td>Item B</td><td>Item C</td></tr>"; 
    document.getElementById("head1").onmouseout = function(getScroll) { 
     setTimeout(function() { 
      document.getElementById("subMenu").onmouseover = function(breakTimeout) { // **Code A** 
       a = 10000; 
       // **Stop timeout.** Now never execute Code B. 
       document.getElementById("subMenu").onmouseout = function(endFunction) { 
        document.getElementById("subMenu").innerHTML = '<tr><td>Content is Dynamic!</td></tr>'; 
        // **Exit function here immediately** 
       } 
      } 
      if(a==500){ 
      //**Code B**: Only execute if **Code A** never executed within time frame 
       document.getElementById("subMenu").innerHTML = '<tr><td>Dynamic Content!</td></tr>'; 
      } 
     }, a) 
    } 
}​ 

나는 희망을 내 디자인의 개념 또한 분명합니다. 코드와 설명이 명확하지 않은 경우 추가 질문을 명확하게 해 드리겠습니다.

답을 얻을 수있는 누구에게나 고맙습니다. +1.

+1

당신은 설명 할 수 - 귀하의 페이지에 HTML 요소에 대한 특정 참조 - 당신이 원하는? –

+0

mouseover id = "head1"일 때 id = "submenu"인 getinnerHTML을 사용하여 Item A Item B 항목 C 메뉴를 표시합니다. "head1"의 Onmouseout은 마우스가 id = "submenu"(즉, 해당 메뉴를 스크롤)로 이동하지 않은 한 500 밀리 초 후에 하위 메뉴를 숨 깁니다. true 인 경우 마우스가 하위 메뉴를 떠날 때까지 하위 메뉴를 숨기지 않습니다. true 인 경우 submenu.innerHTML을 '동적 콘텐츠'로 즉시 변경하십시오. – Wagtail

답변

1

원본 전제에 결함이 있습니다. setTimeout()에 전달 된 함수 본문은 시간이 경과 할 때까지 실행되지 않으므로 시간 초과를 중지하려는 코드는 너무 늦을 때까지 실행되지 않습니다. 나는 당신이 원하는 것이라고 생각하는 표준 인 clearTimeout()을 사용하도록 코드를 수정했다.

var a = 500, head1 = document.getElementById('head1'), subMenu = document.getElementById('subMenu'), timeout; 

head1.onmouseover = function(displayMenu) { 
    subMenu.innerHTML = '<tr><td>Item A</td><td>Item B</td><td>Item C</td></tr>'; 
    head1.onmouseout = function(getScroll) { 
     subMenu.onmouseover = function(breakTimeout) { 
      clearTimeout(timeout); 
      subMenu.onmouseout = function(endFunction) { 
       subMenu.innerHTML = '<tr><td>Content is Dynamic!</td></tr>'; 
      }; 
     }; 
     timeout = setTimeout(function() { 
      document.getElementById("subMenu").innerHTML = '<tr><td>Dynamic Content!</td></tr>'; 
     }, a); 
    }; 
}; 

Working DEMO

+0

감사! 나는 여전히 이것을보고 있습니다 ... – Wagtail

+0

왜 아이템 A, 아이템 B 또는 아이템 C를 스크롤 할 수 없습니까? – Wagtail

+1

@wagtail 코드와 jsFiddle을 약간 수정했습니다. 나는'setTimeout()'호출에'a'를 넘겨 줘서 함수가 자동으로 실행되고있었습니다. 필자는 피리어드에서 지연을 0.5 초에서 2 초로 늘렸으므로 좀 더 분명합니다. –

0

당신은 당신은 다음 (한 window.myTimeout이 수정되지 않는 한) 이런 모든 상황에서 타임 아웃을 취소 할 수 있습니다

window.myTimeout = setTimeout(function() { 
    // ... 
}, a); 

에서는 setTimeout()의 반환 값을 저장하는 전역 변수를 사용할 수 있습니다 :

clearTimeout(window.myTimeout); 

참고 : '창'부분은 선택 사항입니다. 글로벌 변수를 쉽게 식별 할 수 있도록하기 위해 개인적으로 사용하는 컨벤션입니다. 특히 코드가 복잡하거나 거대한 경우에 특히 그렇습니다.

+0

하지만 여전히 실행하려는 섹션 (예 : ** 코드 A **)을 포함한 전체 루프가 지워집니다 – Wagtail

+1

@wagtail 전체 전제에 결함이 있습니다. 코드 A는 ** 제한 시간이 끝난 후 **까지 실행되지 않습니다. –

+0

정말. 어떻게 재배치합니까? 나는 이것을 처음에는 보지 못했다! – Wagtail

관련 문제