>  기사  >  웹 프론트엔드  >  웹 개발 시 터치 이벤트 예시에 대한 자세한 설명

웹 개발 시 터치 이벤트 예시에 대한 자세한 설명

小云云
小云云원래의
2018-01-17 16:57:521278검색

이 글은 주로 모바일 웹 개발에 있어서 터치 이벤트 예시에 대한 자세한 설명을 공유하는데 좋은 참고자료가 되어 모든 분들께 도움이 되었으면 좋겠습니다. 편집자를 따라 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

이전 단어

iOS용 Safari는 개발자에게 특별한 정보를 전달하기 위해 몇 가지 새로운 독점 이벤트를 추가했습니다. iOS 장치에는 마우스나 키보드가 없기 때문에 모바일 Safari용 대화형 웹 페이지를 개발할 때 일반적인 마우스 및 키보드 이벤트만으로는 충분하지 않습니다. Android에 WebKit이 추가되면서 이러한 독점 이벤트 중 상당수가 사실상의 표준이 되었고, 이로 인해 W3C는 터치 이벤트 사양 개발을 시작하게 되었습니다. 이번 글에서는 모바일 터치 이벤트에 대해 자세히 소개하겠습니다

개요

iOS 2.0 소프트웨어가 포함된 iPhone 3G가 출시되었을 때 새로운 버전의 Safari 브라우저도 포함되었습니다. 이 새로운 모바일 Safari는 터치 조작과 관련된 몇 가지 새로운 이벤트를 제공합니다. 나중에 Android의 브라우저는 동일한 이벤트를 구현했습니다. 터치 이벤트는 사용자가 화면에 손가락을 대거나, 화면을 가로질러 슬라이드하거나, 화면에서 멀어질 때 트리거됩니다. 구체적으로 다음과 같은 터치 이벤트가 있습니다


touchstart:当手指触摸屏幕时触发;即使已经有一个手指放在了屏幕上也会触发
touchmove:当手指在屏幕上滑动时连续地触发。在这个事件发生期间,调用preventDefault()可以阻止滚动
touchend:当手指从屏幕上移开时触发
touchcancel:当系统停止跟踪触摸时触发(不常用)。关于此事件的确切触发时间,文档中没有明确说明

[touchenter 및 touchleave]

터치 이벤트 사양에는 한때 사용자의 손가락이 요소 안팎으로 움직일 때 트리거되는 touchenter 및 touchleave 이벤트가 포함되어 있었습니다. 그러나 이 두 가지 사건은 결코 실현되지 않았습니다. Microsoft에는 이 두 가지 이벤트에 대한 대체 이벤트가 있지만 IE에서만 지원됩니다. 어떤 경우에는 사용자의 손가락이 요소 안팎으로 미끄러지는지 아는 것이 매우 유용하므로 이 두 이벤트가 표준으로 돌아올 수 있기를 바랍니다

터치 이벤트에서 일반적으로 사용되는 세 가지 이벤트는 touchstart, touchumove 및 touchend입니다. 마우스 이벤트에 해당하는 이벤트는 다음과 같습니다


鼠标   触摸   
mousedown touchstart 
mousemove touchmove 
mouseup  touchend

[참고] 이벤트를 추가하기 위해 DOM0 레벨 이벤트 핸들러를 사용하는 크롬 시뮬레이터의 일부 버전에서는 터치 이벤트가 유효하지 않습니다


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <style>
 #test{height:200px;width:200px;background:lightblue;}
 </style>
</head>
<body>
<p id="test"></p>
<script>
 (function(){ 
 var 
  stateMap = {
  touchstart_index : 0,
  touchmove_index : 0,
  touchend_index : 0
  },
  elesMap = {
  touch_obj: document.getElementById(&#39;test&#39;)
  },
  showIndex, handleTouch;
 showIndex = function ( type ) {
  elesMap.touch_obj.innerHTML = type + &#39;:&#39; + (++stateMap[type + &#39;_index&#39;]);
 };
 handleTouch = function ( event ) {
  showIndex( event.type );
 };
 elesMap.touch_obj.addEventListener(&#39;touchstart&#39;, function(event){handleTouch(event);}); 
 elesMap.touch_obj.addEventListener(&#39;touchmove&#39;, function(event){handleTouch(event);});
 elesMap.touch_obj.addEventListener(&#39;touchend&#39;, function(event){handleTouch(event);});
 })(); 
</script>
</body>
</html>

300ms

300ms 문제는 요소가 해당 기능을 수행하고 터치 이벤트를 실행하는 사이의 300밀리초 간격을 나타냅니다. 터치 이벤트와 비교하면 마우스 이벤트, 포커스 이벤트, 브라우저 기본 동작 등은 모두 300ms의 지연이 있습니다

【클릭 연결】

300ms가 존재하므로 일반적인 클릭 통과 문제가 발생합니다. 먼저 예제를 살펴보겠습니다


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>Document</title>
 <style>
  #test {position: absolute;top: 0;left: 0;opacity: 0.5;height: 200px;width: 200px;background: lightblue;}
 </style>
</head>
<body>
 <a href="https://baidu.com">百度</a>
 <p id="test"></p>
 <script>
  (function () {
   var
    elesMap = {
     touchObj: document.getElementById(&#39;test&#39;)
    },
    fnHide, onTouch;
   fnHide = function (type) {
    elesMap.touchObj.style.display = &#39;none&#39;;
   };
   onTouch = function (event) {
    fnHide();
   };
   elesMap.touchObj.addEventListener(&#39;touchstart&#39;, function(event){onTouch(event);});
  })(); 
 </script>
</body>
</html>

하늘색 반투명 ​​p를 클릭한 후(터치 이벤트 트리거), 클릭 위치가 링크 바로 위에 있으면 링크 점프의 기본 동작이 트리거됩니다. 자세한 설명은 페이지를 클릭하면 브라우저가 클릭한 페이지의 좌표를 기록하고 300ms 후에 이 좌표에서 요소를 찾을 수 있다는 것입니다. 이 요소에 대한 클릭 동작을 트리거합니다. 따라서 동일한 페이지 좌표의 상위 요소가 300ms 이내에 사라지면 300ms 후에 하위 요소에 클릭 동작이 발생합니다. 이로 인해 클릭연결 문제가 발생합니다

이 문제는 화면을 터치하는 동작이 과부하되어 발생합니다. 손가락이 화면을 터치하는 순간 브라우저는 사용자가 탭, 더블 탭, 슬라이딩, 홀드 또는 기타 작업을 수행하는지 예측할 수 없습니다. 유일하게 안전한 방법은 잠시 기다렸다가 다음에 무슨 일이 일어나는지 지켜보는 것입니다

문제는 두 번 탭하는 것입니다. 브라우저가 손가락이 화면에서 떨어진 것을 감지하더라도 다음에 무엇을 해야 할지 알 수 없습니다. 브라우저는 손가락이 다시 화면으로 돌아올지, 탭 이벤트와 이벤트 캐스케이드 트리거가 종료될지 알 수 없기 때문입니다. 이를 확인하려면 브라우저가 잠시 기다려야 합니다. 브라우저 개발자는 300ms라는 최적의 시간 간격을 찾았습니다

[해결책]

1. 터치 이벤트의 이벤트 핸들러에 300ms 지연을 추가합니다


(function () {
   var
    elesMap = {
     touchObj: document.getElementById(&#39;test&#39;)
    },
    fnHide, onTouch;
   fnHide = function (type) {
    elesMap.touchObj.style.display = &#39;none&#39;;
   };
   onTouch = function (event) {
    setTimeout(function(){
     fnHide();
    },300);
   };
   elesMap.touchObj.addEventListener(&#39;touchstart&#39;, function (event) { onTouch(event); });
  })();

2. 300ms 전환 효과를 높이려면 이징 애니메이션을 사용하세요. 표시 속성은 전환을 사용할 수 없습니다

3. 중간 레이어에 dom 요소를 추가하고 중간 레이어에서 이 침투 이벤트를 허용한 후 나중에 숨깁니다

4. 상위 레벨과 하위 레벨 모두 탭 이벤트를 사용합니다. 기본 동작을 사용할 수 없습니다.

5 문서의 touchstart 이벤트로 인해 기본 동작이 방지됩니다.


document.addEventListener(&#39;touchstart&#39;,function(e){
  e.preventDefault();
})

다음으로 a 태그의 점프 동작을 추가하세요


a.addEventListener(&#39;touchstart&#39;,function(){
 window.location.href = &#39;https://cnblogs.com&#39;; 
})

그러나 이 방법에는 페이지를 스크롤할 수 없고 텍스트를 선택할 수 없는 부작용이 있습니다. 등. 특정 요소에 대한 텍스트 선택 동작을 복원해야 하는 경우 버블링 방지를 사용하여 복원할 수 있습니다.


el.addEventListener(&#39;touchstart&#39;,function(e){
  e.stopPropagation();
})

Event object

【기본 정보】

각 터치 이벤트의 이벤트 객체는 다음과 같습니다. 이벤트 유형, 이벤트 대상 개체, 이벤트 버블링, 이벤트 흐름, 기본 동작 등을 포함한 마우스 이벤트의 공통 속성입니다.

터치스타트를 예로 들면 샘플 코드는 다음과 같습니다


<script>
  (function () {
   var
    elesMap = {
     touchObj: document.getElementById(&#39;test&#39;)
    },
    onTouch;
   onTouch = function (e) {
     console.log(e)
  };
   elesMap.touchObj.addEventListener(&#39;touchstart&#39;, function (event) { onTouch(event); });
  })(); 
 </script>

1. 이벤트를 반환합니다. 실행 중인 청취 함수

2에 바인딩된 노드입니다. 대상 속성은 이벤트

3의 실제 대상 노드를 반환합니다. srcElement 속성은 대상 속성


과 동일한 기능을 갖습니다.
//当前目标
currentTarget:[object HTMLpElement]
//实际目标
target:[object HTMLpElement]
//实际目标
srcElement:[object HTMLpElement]

4、eventPhase属性返回一个整数值,表示事件目前所处的事件流阶段。0表示事件没有发生,1表示捕获阶段,2表示目标阶段,3表示冒泡阶段

5、bubbles属性返回一个布尔值,表示当前事件是否会冒泡。该属性为只读属性

6、cancelable属性返回一个布尔值,表示事件是否可以取消。该属性为只读属性


//事件流
eventPhase: 2
//可冒泡
bubbles: true
//默认事件可取消
cancelable: true

【touchList】

除了常见的DOM属性外,触摸事件对象有一个touchList数组属性,其中包含了每个触摸点的信息。如果用户使用四个手指触摸屏幕,这个数组就会有四个元素。一共有三个这样的数组

1、touches:当前触摸屏幕的触摸点数组(至少有一个触摸在事件目标元素上)

2、changedTouches :导致触摸事件被触发的触摸点数组

3、targetTouches:事件目标元素上的触摸点数组

如果用户最后一个手指离开屏幕触发touchend事件,这最后一个触摸点信息不会出现在targetTouches和touches数组中,但是会出现在changedTouched数组中。因为是它的离开触发了touchend事件,所以changedTouches数组中仍然包含它。上面三个数组中,最常用的是changedTouches数组


(function () {
   var
    elesMap = {
     touchObj: document.getElementById(&#39;test&#39;)
    },
    onTouch;
   onTouch = function (e) {
     elesMap.touchObj.innerHTML = &#39;touches:&#39; + e.touches.length
                  + &#39;<br>changedTouches:&#39; + e.changedTouches.length
                  + &#39;<br>targetTouches:&#39; + e.targetTouches.length;
   };
   elesMap.touchObj.addEventListener(&#39;touchstart&#39;, function (event) { onTouch(event); });
  })();

【事件坐标】

上面这些触摸点数组中的元素可以像普通数组那样用数字索引。数组中的元素包含了触摸点的有用信息,尤其是坐标信息。每个Touch对象包含下列属性


clientx:触摸目标在视口中的x坐标
clientY:触摸目标在视口中的y坐标
identifier:标识触摸的唯一ID
pageX:触摸目标在页面中的x坐标(包含滚动)
pageY:触摸目标在页面中的y坐标(包含滚动)
screenX:触摸目标在屏幕中的x坐标
screenY:触摸目标在屏幕中的y坐标
target:触摸的DOM节点目标

changedTouches数组中的第一个元素就是导致事件触发的那个触摸点对象(通常这个触摸点数组不包含其他对象)。这个触摸点对象含有clientX/Y和pageX/Y坐标信息。除此之外还有screenX/Y和x/y,这些坐标在浏览器间不太一致,不建议使用

clientX/Y和pageX/Y的区别在于前者相对于视觉视口的左上角,后者相对于布局视口的左上角。布局视口是可以滚动的


(function () {
   var
    elesMap = {
     touchObj: document.getElementById(&#39;test&#39;)
    },
    onTouch;
   onTouch = function (e) {
    var touch = e.changedTouches[0];
    elesMap.touchObj.innerHTML = &#39;clientX:&#39; + touch.clientX + &#39;<br>clientY:&#39; + touch.clientY
     + &#39;<br>pageX:&#39; + touch.pageX + &#39;<br>pageY:&#39; + touch.pageY
     + &#39;<br>screenX:&#39; + touch.screenX + &#39;<br>screenY:&#39; + touch.screenY
   };
   elesMap.touchObj.addEventListener(&#39;touchstart&#39;, function (event) { onTouch(event); });
  })();

相关推荐:

JS手机端touch事件计算滑动距离的方法

有关touch事件解析和封装的知识

javascript移动设备Web开发中对touch事件的封装实例_javascript技巧


위 내용은 웹 개발 시 터치 이벤트 예시에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.