2013-10-04 5 views
0

마우스가 내려 갔을 때 함수를 계속 실행하는 것을 실험하고있었습니다. 나는 정확히 내가 원하는 것을 무한히 반복 할 수있게했지만, 더 이상 그 루프를 멈추게 할 수는 없다. mouseleave 또는 mouseout에 대한 무한 루프 중지

나는 일을 시도 : - 거짓 인자를 가지고 루프를 중단해야

$(document).on("mouseup mouseout",".someclass",function(){ loop(false) }); 

합니다. 그러나 루프가 무한히 계속되어 페이지가 충돌합니다. mouseup, mouseout, mouseleave 중 어떤 이벤트가 호출 될 때마다 무한 루프가 멈추기를 바란다. 지금까지

내 시도 : - http://jsfiddle.net/ZQTvN/

이 브라우저를 충돌합니다 실현 마십시오.

당신은 당신이 원하는 것을 달성하기 위해 플래그과의 setTimeout을 사용하도록 코드를 변경할 수 있습니다
+1

최종 목표는 무엇입니까? 아마도 우리는 더 나은 appraoch을 제안 할 수 있습니다 –

+0

내 목표는 그 사건이 일어나는 동안 (keypress, mousedown과 같은) 이벤트 호출에 대한 함수를 계속 트리거하고 이벤트가 끝난 직후에 함수를 중지하는 것입니다. – shriek

+1

글쎄, 나는이 기능이 무엇을 의미합니까? 마찬가지로 - 사용자가 이미지 위로 마우스를 가져가는 데 걸리는 시간을 모니터링합니다. 그러나 세부 사항이 없어도 마우스 센터 나 기타 이벤트에 부울을 설정하고 루프 함수를 해당 부울을 기반으로하는 조건으로 지속적으로 실행하는 것이 좋습니다. 그래서'setInterval (function() {if (some_var) {...}}, 500)'이벤트의 경우 some_var을 true로 설정하고 반대 이벤트의 경우 false로 설정합니다. –

답변

2

:

이 (바쁜 루프) 같은 꽉 루프는 기본적으로없는 있도록 브라우저에서 모든 입력을 차단합니다 이벤트 큐를 파싱한다. 브라우저가 잠겼습니다. 을 중지 할 때 감지 할 필요가 브라우저뿐만 아니라 다른 이벤트를 대기 할 수 있도록 루프를 할 수있는 setTimout을 구현함으로써

. 당신이 인수는 사실 만 다시 트리거 여러 번 것이다 때마다 루프를 호출 할 경우

. 거짓 플래그로 호출하면 플래그는 해당 호출에 대해 로컬이되고이 로캘 플래그에 액세스 할 수 없기 때문에 시작된 다른 루프에는 아무 작업도 수행하지 않습니다.

그래서 한 가지 방법은 외부 (일반 플래그, 글로벌 범위를) 깃발을 넣어하는 것입니다

MODIFIED FIDDLE HERE

예 : 잡고

var doLoop = false; 

function loopy() { 
    if (doLoop === true) { 
     setTimeout(function() { 
      console.log(doLoop); 
      loopy(); 
     }, 11); 
    } 

}; 
$(document).on("mousedown", ".classy", function() { 
    doLoop = true; 
    loopy(); 
}); 
$(document).on("mouseup mouseout", ".classy", function() { 
    doLoop = false; 
}); 

이제 루프가 실행을 볼 수 있습니다 마우스를 내리고 놓으면 해제됩니다.