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


  • 浏览器切换为手机模式下运行
  • 或者真机调试都可以
目录
相关文章
|
JSON JavaScript 前端开发
❤Nodejs 第九章(token身份认证和express-jwt的安装认识)
【4月更文挑战第9天】Node.js第九章介绍了Token身份认证,特别是JWT(JSON Web Token)作为跨域认证的解决方案。JWT由Header、Payload和Signature三部分组成,用于在客户端和服务器间安全传输用户信息。前端收到JWT后存储在localStorage或sessionStorage中,并在请求头中发送。Express-JWT是一个中间件,用于解析JWT。基本用法包括设置secret和algorithms。注意安全问题,避免混合使用不同算法以防止降级攻击。
330 0
|
前端开发 JavaScript 中间件
Nest 框架:解锁企业级 Web 应用开发的秘密武器(下)
Nest 框架:解锁企业级 Web 应用开发的秘密武器(下)
Nest 框架:解锁企业级 Web 应用开发的秘密武器(下)
|
前端开发 JavaScript
使用 CSS variables 和Tailwind css实现主题换肤
最近在网上看到 Tailwind Labs的实现的[换肤视频],决定使用 Tailwind css 实现博客列表主题换肤。
1521 0
|
11月前
|
数据采集
动态代理与静态代理在爬虫解析的优缺点
随着科技和互联网的发展,越来越多企业需要使用代理进行数据抓取。本文介绍了HTTP动态代理与静态代理的区别,帮助您根据具体需求选择最佳方案。动态代理适合大规模、高效率的爬取任务,但稳定性较差;静态代理则适用于小规模、高稳定性和速度要求的场景。选择时需考虑目标、数据量及网站策略。
210 4
|
安全 JavaScript 前端开发
kotlin开发安卓app,JetPack Compose框架,给webview新增一个按钮,点击刷新网页
在Kotlin中开发Android应用,使用Jetpack Compose框架时,可以通过添加一个按钮到TopAppBar来实现WebView页面的刷新功能。按钮位于右上角,点击后调用`webViewState?.reload()`来刷新网页内容。以下是代码摘要:
|
Web App开发 JavaScript 前端开发
js 调试—— 【控制台】debugger语句 、 命令行API
js 调试—— 【控制台】debugger语句 、 命令行API
620 0
|
XML 移动开发 前端开发
HTML5 SVG和canvas的性能探讨
HTML5 中的 SVG(可缩放矢量图形)和 Canvas(画布)分别用于网页图形绘制。SVG 基于矢量图形,使用 XML 描述,适合静态或少量动态内容(如图标、图表),易于编辑且保持高分辨率;Canvas 则基于位图,通过 JavaScript 绘制,更适合快速更新大量图形的场景(如游戏、动态动画),但在复杂图形计算时可能遇到性能瓶颈。总体而言,SVG 适用于静态和少量动态内容,而 Canvas 更适合高频率更新和性能要求高的场景。
|
存储 JSON 安全
OAuth2与JWT在API安全中的角色:技术深度解析
【7月更文挑战第20天】OAuth2和JWT作为两种重要的安全协议,在API安全中发挥着不可或缺的作用。OAuth2通过提供灵活的授权框架,实现了对资源的细粒度访问控制;而JWT则通过其紧凑性和自包含性,确保了身份验证和信息传输的安全性。在实际应用中,将OAuth2和JWT结合使用,可以构建出既强大又安全的API服务,为用户提供更加安全、可靠和便捷的数字体验。
|
JavaScript
小而美的IKUN-UI组件库源码学习(前言)
小而美的IKUN-UI组件库源码学习(前言)
366 0
小而美的IKUN-UI组件库源码学习(前言)
|
Ubuntu 安全 搜索推荐
Linux Ubuntu 桌面环境概览
Ubuntu,在开源领域如同璀璨明星,以其卓越的桌面环境和用户体验赢得全球用户的心。采用优雅且功能丰富的GNOME桌面,Ubuntu界面简洁现代,提供直观易用的操作体验。无论是文件管理还是系统设置,图形界面让一切变得轻松。此外,高度可定制化特性让桌面成为个性展示的舞台,集成丰富应用满足多样化需求。背后强大的社区支持确保用户获得及时帮助,共享开源精神。
478 0