H5移动端常用事件,此中大有文章

简介: 笔记

1. 移动端事件


  • 首先,移动端不建议使用 click 事件
  • 因为它有300毫秒的延迟,对用户体验不太友好

常用事件:touchstart(),touchend(),touchmove()

HTML文件

<!DOCTYPE html>
<html lang="ZH-cn">
    <head>
        <meta charset="utf-8">
        <title>标题</title>
        <meta name="viewport" content = "width=device-width, initial-scale=1.0, user-scalable=no"/>
    </head>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        html,body{
            height: 100%;
        }
        .con{
            height: 300px;
            width: 200px;
            color: white;
            background: green;
        }
    </style>
    <body>
        <h1>移动端事件</h1>
        <button 
            class="touchstart"
            id="touchstart"
        >
                点击我
        </button>
        <div class="con" id="con">
        </div>
    </body>
</html>

JS部分

function $my(id){
    return document.getElementById(id);
}
let btn = $my("touchstart");
let con = $my("con");
// 一样的会触发,但不建议使用
// btn.addEventListener("click", function(){
//     console.log("click");
// })
// 手指触摸事件
btn.addEventListener("touchstart", function(){
    console.log("touchstart");
})
// 手指松开事件
btn.addEventListener("touchend", function(){
    console.log("touchend");
})
// 手指移动事件 + 事件节流
let time = null;
con.addEventListener("touchmove", function(){
    if(!time){
        time = setTimeout(()=>{
            console.log("快乐的飞起");
            time = null;
        },1000)
    }
})

大家可以先试一下效果,复制代码即可大家可以先试一下效果,复制代码即可1.png


2. 封装移动端自定义事件

  • 众所周知:低版本安卓手机上是没有touch类事件的
  • 所以我们只能自己封装

2.1 封装移动端单击与长按事件

(function(window){
    // 对外开放的接口
    function myMobile(selector){
        return myMobile.prototype._init(selector);
    }
    myMobile.prototype = {
        _init: function(selector){
            if(typeof selector === "string"){
                this.ele = window.document.querySelector(selector);
                // this:原型对象
                return this;
            }
        },
        // 单击事件
        tap: function(hanler){
            this.ele.addEventListener("touchstart", tochFn);
            this.ele.addEventListener("touchend", tochFn);
            let startTime,
                endTime;
            function tochFn(e){
                // e.preventDefault();
                switch (e.type){
                    case "touchstart":
                        startTime = new Date().getTime();
                        break;
                    case "touchend":
                        endTime =  new Date().getTime();
                        // 200是一个阙值
                        if( endTime - startTime < 200){
                            hanler.call(this, e);
                        }
                    break;
                }
            }
        },
        // 长按事件
        longtap: function(hanler){
            this.ele.addEventListener("touchstart", tochFn);
            this.ele.addEventListener("touchmove", tochFn);
            this.ele.addEventListener("touchend", tochFn);
            let timerId;
            function tochFn(e){
                // e.preventDefault();
                switch (e.type){
                    case "touchstart":
                        timerId = setTimeout(function(){
                            hanler.call(this, e);
                        },2000)
                        break;
                    case "touchmove":
                        clearTimeout(timerId);
                        break;
                    case "touchend":
                       clearTimeout(timerId)
                       break;
                }
            }
        },
        // 左侧滑动
    }
    window.$ = window.myMobile = myMobile;
})(window);

2.2 封装左侧滑动与右侧滑动

   slideLeft: function (hanler){
            this.ele.addEventListener("touchstart", touchFn);
            this.ele.addEventListener("touchend", touchFn);
            var startX, startY, endX, endY;
            function touchFn(e){
                e.preventDefault();
                // console.log(e.changedTouches);
                var firstTouch = e.changedTouches[0];
                switch (e.type){
                    case "touchstart":
                        startX = firstTouch.pageX;
                        startY = firstTouch.pageY;
                        break;
                    case "touchend":
                        endX = firstTouch.pageX;
                        endY = firstTouch.pageY;
                        // x方向移动的距离大于Y(定义为左滑操作)并且移动距离超过了25px
                        if ( Math.abs(endX - startX) >= Math.abs(endY -startY) && startX - endX >= 25){
                            hanler.call(this, e)
                        }
                        break;
                }
            }
        }

3. FAQ


  • 浏览器切换为手机模式下运行
  • 或者真机调试都可以
目录
相关文章
|
小程序 JavaScript
微信小程序默认获取聚焦事件
微信小程序默认获取聚焦事件
150 0
|
27天前
|
前端开发 JavaScript Android开发
移动端点击事件:原理、问题与解决方案
前端技术在移动端点击事件上的应用,涉及触屏交互、响应速度优化及用户体验提升,确保网页或应用在手机等移动设备上流畅运行。
|
1月前
|
监控 UED 开发者
鸿蒙next版开发:订阅应用事件(ArkTS)
在HarmonyOS 5.0中,ArkTS引入了强大的应用事件订阅机制,允许开发者订阅和处理系统或应用级别的事件,这对于监控应用行为、优化用户体验和进行性能分析至关重要。本文详细介绍了如何在ArkTS中订阅应用事件,并提供了示例代码,包括导入模块、创建观察者、设置事件参数等步骤。通过这些方法,开发者可以更智能地管理和响应应用事件。
97 11
|
1月前
|
监控 开发者 UED
鸿蒙5.0版开发:订阅卡死事件(ArkTS)
在HarmonyOS 5.0中,开发者可以通过ArkTS订阅应用的卡死事件,以便在应用卡死时进行处理。本文详细介绍如何在ArkTS中订阅卡死事件,并提供示例代码。通过导入hiAppEvent和hilog模块,设置自定义参数,添加事件观察者,开发者可以监控应用稳定性并在问题发生时快速定位原因。示例代码展示了如何创建按钮订阅卡死事件,并在事件发生时通过回调函数处理和记录日志。
48 5
|
3月前
|
JSON 小程序 JavaScript
微信小程序页面事件,下拉刷新事件和上拉触底事件
这篇文章介绍了微信小程序中如何实现下拉刷新和上拉触底事件,包括开启下拉刷新、配置下拉刷新样式、监听下拉刷新事件,以及监听上拉触底事件和配置上拉触底的距离。
|
6月前
|
JavaScript 前端开发
技术好文共享:移动端事件(二)——移动端滑屏切换的幻灯片
技术好文共享:移动端事件(二)——移动端滑屏切换的幻灯片
25 0
|
7月前
|
XML Java Android开发
Android App开发触摸事件中手势事件Event的分发流程讲解与实战(附源码 简单易懂)
Android App开发触摸事件中手势事件Event的分发流程讲解与实战(附源码 简单易懂)
109 0
|
前端开发 JavaScript 定位技术
移动端手势事件和触摸交互
移动端手势事件和触摸交互
198 0
|
Android开发
Flutter(十三)——事件处理:手势识别与事件通知
Flutter(十三)——事件处理:手势识别与事件通知
359 2
Flutter(十三)——事件处理:手势识别与事件通知
|
JavaScript Android开发 开发者
【JavaScript-移动端常用事件】了解移动端touch触摸事件
【JavaScript-移动端常用事件】了解移动端touch触摸事件
302 0
【JavaScript-移动端常用事件】了解移动端touch触摸事件