Home  >  Article  >  Web Front-end  >  Touch events in mobile web development (detailed tutorial)

Touch events in mobile web development (detailed tutorial)

亚连
亚连Original
2018-06-11 16:42:131888browse

Below I will share with you a detailed explanation of a touch event example in mobile web development. It has a good reference value and I hope it will be helpful to everyone.

Previous words

In order to convey some special information to developers, Safari for iOS has added some new exclusive events. Because iOS devices have neither a mouse nor a keyboard, regular mouse and keyboard events are simply not enough when developing interactive web pages for mobile Safari. With the addition of WebKit in Android, many of these proprietary events became de facto standards, leading the W3C to begin developing the Touch Events specification. This article will introduce the mobile touch event in detail

Overview

When the iPhone 3G containing iOS 2.0 software was released, it also included a new version of the Safari browser. This new mobile Safari provides some new events related to touch operations. Later, browsers on Android also implemented the same event. Touch events are triggered when the user places their finger on the screen, slides it across the screen, or moves it away from the screen. Specifically, there are the following touch events

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

[touchenter and touchleave]

The touch event specification once included touchenter and touchleave events. These two events occur when the user's finger moves in or out of a certain area. Triggered when there are elements. But these two events were never realized. Microsoft has alternative events for these two events, but only IE supports them. In some cases, it is very useful to know whether the user's finger slides in and out of an element, so we hope that these two events can return to the specification

In touch events, the commonly used ones are touchstart, touchumove and The three events of touchend correspond to the mouse events as follows

鼠标   触摸   
mousedown touchstart 
mousemove touchmove 
mouseup  touchend

[Note] Some versions of the touch event under the chrome simulator use the DOM0 level event handler to add events that are invalid

<!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

The 300ms problem refers to a 300 millisecond interval between an element performing its function and executing a touch event. Compared with touch events, mouse events, focus events, browser default behaviors, etc. all have a delay of 300ms

[Click through]

Because of the existence of 300ms, it will cause common click through question. Let’s look at the example first

<!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>

After the light blue translucent p is clicked (triggering the touch event), if the click position is just above the link, the default behavior of link jump will be triggered. The detailed explanation is that after clicking on the page, the browser will record the coordinates of the clicked page, and 300ms later, the element will be found at these coordinates. Trigger click behavior on this element. Therefore, if the upper element of the same page coordinate disappears within 300ms, a click behavior will be triggered on the lower element 300ms later. This causes a point-through problem

This problem is caused because the behavior of touching the screen is overloaded. At the moment when the finger touches the screen, the browser cannot predict whether the user is tapping, double-tap, sliding, holding or any other operation. The only safe thing to do is to wait a while and see what happens next

The problem is Double-Tap. Even if the browser detects that the finger has been lifted off the screen, it still has no way of knowing what to do next. Because the browser has no way of knowing whether the finger will return to the screen again, or whether it will end triggering the tap event and event cascade. To determine this, the browser has to wait for a short period of time. Browser developers found an optimal time interval, which is 300 milliseconds

[Solution]

1. Add a 300ms delay in the event handler of the touch event

(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. Use easing animation and add a 300ms transition effect. Note that the display attribute cannot use transition

3. Add the dom element of the middle layer to let the middle layer accept the penetration event and hide it later

4. Both the upper and lower levels use tap events, but the default behavior is inevitable

5. The touchstart event on the document prevents the default behavior.

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

Next, add the jump behavior of the a tag

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

However, this method has side effects, which will cause the page to be unable to scroll, the text to be unable to be selected, etc. If you need to restore the text selection behavior on an element, you can use prevent bubbling to restore

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

Event object

【 Basic information】

The event object of each touch event provides common attributes in mouse events, including event type, event target object, event bubbling, event flow, default behavior, etc.

Take touchstart as an example, the sample code is as follows

<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. The currentTarget attribute returns the node bound to the listening function being executed by the event

2. The target attribute returns the actual target node of the event

3. The srcElement attribute has the same function as the target attribute.

//当前目标
currentTarget:[object HTMLpElement]
//实际目标
target:[object HTMLpElement]
//实际目标
srcElement:[object HTMLpElement]

4. The eventPhase attribute returns an integer value, indicating the event flow stage in which the event is currently located. 0 means the event did not occur, 1 means the capture stage, 2 means the target stage, 3 means the bubbling stage

5. The bubbles attribute returns a Boolean value, indicating whether the current event will bubble. This property is a read-only property

6. The cancelable property returns a Boolean value indicating whether the event can be canceled. This attribute is a read-only attribute

//事件流
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); });
  })();

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在angularjs中使用$http实现异步上传Excel文件方法

通过vuejs如何实现数据驱动视图原理

在Vue中如何使用父组件调用子组件事件

在vue中如何实现密码显示隐藏切换功能

在vue.js中详细解读this.$emit的使用方法

The above is the detailed content of Touch events in mobile web development (detailed tutorial). For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn