2011-10-13 1 views
5

사용자가 손가락으로 위아래로 스크롤 할 수있는 구성 요소가 포함 된 웹 기반 응용 프로그램이 있습니다. 이벤트의 preventDefault 메서드를 사용하여 터치 동작이 iOS 장치에서 전체 화면을 이동시키는 기본 동작을 방지합니다.iOS 5에서 touchmove 이벤트의 기본 동작을 방지하려면 어떻게해야합니까?

내가 오늘 아침에 업그레이드 한 iOS 5에서는 불행히도 더 이상 작동하지 않는 것 같습니다. 나는 이것이 iOS 5에서 다르게 수행되었다고 가정해야하지만 지침을 제공하는 리소스를 아직 찾을 수 있어야합니다.

감사합니다.

업데이트 # 1 : 특정 질문에 대한 답변을 찾을 수 없었지만 -webkit-overflow-scrolling 스타일을 사용하기 위해 코드를 약간 조정할 수있었습니다 ("touch ") 스네이크 관성 스크롤 기능을 구현합니다 (스 와이프의 속도에 따라 내용이 더 빨리 스크롤되고 경계에 맞으면"고무 밴드가 튀어 오릅니다 ") ...

업데이트 # 2 : 난 이상한 문제가 생겼어. 오버 플로우 스크롤 동작이 때로는 혼란스러워서 내용물을 위아래로 움직이게하기 위해 손가락을 좌우로 드래그해야한다. 이것이 일어나는 이유를 알아내는 방법 - 누군가는 어떤 생각을 가지고 있습니까?

답변

6

첫째, 나는 모든 다음 코드를 사용에서 iOS 5에서 스크롤 e.preventDefault()가 비활성화 것을 확인할 수 있습니다

document.ontouchmove = function(e){ e.preventDefault(); } 

불행하게도, 그러나,이 오버 플로우에 스크롤을 비활성화합니다 div의 스크롤. (내부 요소 스크롤링이 가능한 해결책이 있다면 누구나 공유하십시오.)

업데이트 # 2와 관련하여 다른 스크롤 가능한 요소 (페이지 자체 포함)에 중첩 된 스크롤 가능한 요소가있는 경우 이상한 동작을 발견했습니다. 때때로 장치는 사용자가 스크롤하려는 요소를 주저합니다. 특히 위치를 사용하여이 문제를 발견했습니다 : 고정. 내 솔루션은 본문이 100 % 높이인지 확인하고 스크롤 가능 요소는 위치를 사용하는 것이 었습니다 : 가능한 경우 절대.

+0

어쩌면 당신이 경우'같은 검사를 몇 가지 논리를 할 수있는 (.CSS를 $ (e.currentTarget) ('오버 플로우') = '스크롤'!) E : 요소는, 그러나 이것은 내 경우 zepto.js tap 나누기 .preventDefault();'. scollable 요소의 ontouchmove 뒤에 document.ontouchmove가 실행되므로'el.ontouchmove = function() {allowScroll = true}'를 실행 한 다음'document.ontouchmove'가 그 값을 사용하여 동작을 결정한 다음 값을 다시 설정할 수 있습니다 거짓으로. –

+0

@BrianNickel 팁 주셔서 감사. 이것은 올바른 방향으로 나아가는 단계로서, 요소 단위로 직접 스크롤하는 것을 방지 할 수 있지만 (사용자가 직접 몸체를 스크롤하는 것을 포함하여), 사용자가 스크롤 가능한 요소의 가장자리에 이미있는 스크롤 가능한 요소를 터치하면 범위, 그것은 여전히 ​​몸을 스크롤 (회색 리넨 아래에 표시) 결국 것입니다. 아마도 유일한 방법은 터치 이동 방향을 해석하고 요소가 스크롤 가능 범위의 가장자리에 있는지 확인하는 것입니다. –

+0

@RyanRapp 귀하의 회신에 감사드립니다.아마도 내가 말하는 행동에 대해 명확하게 설명하지 않았을 것입니다. iOS 4에서는 엘리먼트 내의 손가락의 움직임을 기반으로 절대 위치 지정을 통해 내용을 이동할 수 있도록 오버플로의 touchmove 이벤트 핸들러가 포함 된 요소 (예 : DIV) 내에서 e.preventDefault()를 사용합니다. 스크롤하는 데 충분한 콘텐츠가없는 전체 페이지를 내 손가락으로 이동하려고 할 때 e.preventDefault()가이를 차단합니다. 너무 스크롤하지 않고 주위를 돌아 다니며 사파리의 배경 텍스처를 볼 수 있습니다. – natlee75

7

매우 간단한 해결책을 발견했습니다. 이벤트가 스크롤 할 수있는 요소에 도달하면 이벤트에 플래그를 추가하십시오. 문서의 이벤트 리스너에 플래그가 설정되어있는 경우 바로 확인하고 플래그가 설정되어 있지 않은 경우에만 이벤트를 중지 : 문서에서의 EventListener를 필요 없어요, 그래서

this.$scrollableEl.on('touchmove', function(event){ 
    event.comesFromScrollable = true; 
    //when you have containers that are srollable but 
    //doesn't have enough content to scroll sometimes: 
    //event.comesFromScrollable = el.offsetHeight < el.scrollHeight; 
}) 

$document.on('touchmove', function(event){ 
    if(!event.comesFromScrollable){ 
     event.preventDefault() 
    } 
    }) 

또한, 대신 event.stopImmediatePropagation을 사용할 수 있습니다

this.$scrollableEl.on('touchmove', function(event){ 
    event.stopImmediatePropagation() 
}) 
+0

고마워! 매력처럼 작동합니다! 필자는 사용자 정의 데이터 속성을 추가하는 방식을 수정했으며 사용 가능한 스크롤은 중지되지 않습니다. 우리는 하나의 eventlistener를 저장할 수있는이 방법 :) –

관련 문제