2015-01-13 1 views
0

여기에 작은 샘플 앱이 있습니다. http://codepen.io/DouglasGlover/full/OPpMaV/모바일에서 Jquery touchstart/touchend가 깨지는 방향 변경을 유지하려면 어떻게해야합니까?

기술적으로는 데스크톱에서도 작동하지만 모바일 전용 환경입니다. 여기 모바일에 대해서만 관심이 있습니다.

의도 한 동작은 사용자가 전화기에 손을 대고 전화기의 손가락을 화면의 아무 곳에 나 두는 것입니다. 카운터가 올라갈 때 카운터가 올라갑니다. 손가락을 전화기에서 내리면 카운터가 멈 춥니 다.

사용자가 실수로 전화기를 돌려서 사이트의 방향을 전환 할 수있는 유스 케이스가 있습니다. 현재 그러한 일이 발생하면 카운터는 계속해서 무한히 위쪽으로 계산됩니다. 후속 터치는 두 번째 터치 이벤트를 시작하므로 빠르게 진행됩니다 (초기 문제를 해결하면이를 해결해야 함).

내 문제는 오리엔테이션 전환시 터치 이벤트가 "죽습니다"인 것 같습니다. 따라서 "터치 스타트"는 처음에는 발사되며 결코 발사되지 않는 "touchend"를 기다리고 있습니다.

이상적으로 사용자는 휴대 전화를 만져서 아무런 결과없이 (그리고 경험을 깨지 않고) 회전 할 수 있습니다.

<div class="touchspace"></div> 
<div class="ls"> 
    <div class="counter">0</div> 
</div> 
<div class="pt"> 
    <div class="counter">0</div> 
</div> 

CSS :

body{ margin: 0; } 
.ls, .pt{ display: block; width: 100vw; height: 100vh; } 
.ls{ background: lightblue; } 
.pt{ background: lightgreen; } 
.counter{ display: block; position: relative; top: 10%; font-weight: bold; color: white; font-size: 20vw; width: 20%; margin: 0 auto; } 
.touchspace{ display: block; position: absolute; bottom: 0; right: 0; background: transparent; z-index: 999; background: red; width: 500vw; height: 500vh; opacity: .5; } 

@media all and (orientation:landscape){ .ls{ display: none; } } 
@media all and (orientation:portrait){ .pt{ display: none; } } 

JS :

지금의 약자로 여기

은 ...

HTML 프로토 타입 코드의

var counter = 0, interval; $(".touchspace").bind("touchstart mousedown",function(){ interval = window.setInterval(function(){ counter++; $(".counter").html(counter); }, 1000); }); $(".touchspace").bind("touchend mouseup",function(){ window.clearInterval(interval); }); 
+0

해결 방법으로, 방향 변경 이벤트에서 타이머를 2로 나눌 수 있습니까? – FlemGrem

답변

0

오리엔테이션 변경 이벤트를 바인딩하여 종료와 시작을 ​​트리거 할 수 있습니까? 그렇지 않으면 사용자 환경이 너무 많이 중단됩니다. 같은

뭔가 : 간격 내부

$(window).on('orientationchange', function() { 
    $('.touchspace').trigger('touchend'); 
    $('.touchspace').trigger('touchstart'); 
}); 
+0

나는 그걸로 일할 수 있을지도 모른다. 문제는 터치가 끝날 때 발생하는 기능이 있다는 것입니다. 즉, 두 번째 수표 (사실/거짓 수표)를 사용하여 의미가있을 때만 물건을 실행하게 할 수 있습니다. 고마워. 고마워. – Douglas

+0

불행히도 이것은 도움이되지 못했습니다. 사용자의 손가락이 화면에 남아 있다는 사실은 방향 변경시 완전히 사라진 것 같습니다. – Douglas

+0

그렇다면 항상 재미 있지는 않습니다. 페이지로드시 간격을로드하십시오. interval 함수가 isTouching과 같은 sentinal 값을 검사하도록하십시오. false로 초기화하십시오. 터치 시작시 isTouching = true로 설정하고 ontouchend는 false로 만듭니다. 따라서 간격은 실행을 멈추지 않지만 터치 시작을 트리거하지 않으면 아무 것도하지 않습니다. –

0

는 초기 방향이 변경되는 경우 확인하고 간격을 취소합니다. 환경이 없으므로 코드를 테스트 할 수 없습니다!

var counter = 0, 
isOrientationChanged=false, 
interval; 
$(".touchspace").bind("touchstart mousedown",function(){ 
    interval = window.setInterval(function(){ 
    counter++; 
    $(".counter").html(counter); 
    //check if orientation is changed, clear the interval & reset the flag 
    if(isOrientationChanged) 
    { 
     isOrientationChanged=false; 
     window.clearInterval(interval); 
    } 
    }, 1000); 
}); 

$(".touchspace").bind("touchend mouseup",function(){ 
    window.clearInterval(interval); 
}); 

$(window).on('orientationchange', function() { 
    isOrientationChanged=true;//mark the flag true 
}); 
+0

내가 겪고있는 가장 큰 문제는 장치가 DOM을 다시 그릴 때까지 orientationchange가 시작되지 않는다는 것입니다. 모바일 장치 방향이 변경되면 다시 그리기가 발생하여 "터치 영역"이 1 초 동안 존재하지 않아서 touchend 이벤트가 발생합니다. 오리엔테이션 변경에 관해서는 div에서부터 언 바인딩 할 수 있지만, 이것은 다시 그리기 후에 발생합니다. 거의 불가능 해 보이는 것, 나는 그것을 싫어합니다. – Douglas

+0

죄송합니다. Douglas, 적절한 환경 설정이 없으므로 세부적인 도움을 드릴 수 없습니다. 최대한 빨리 개발자 친구에게 도움을 요청할 것입니다. :) – Vijay

0

나는 그것을 달성하기 위해 지난 2 시간을 보냈다. 그것은 당장 불가능합니다 - 현재 예술의 선행 인 것 같습니다. "orientationchange"는 요소의 포커스를 잃습니다.

관련 문제