自定义封装移动端事件库

封装移动端事件库的意义

  1. 移动端使用click事件会有延迟
  2. 有许多左滑或者右滑的操作,原生js没有
  3. 有时业务会需要长按事件,原生js没有
开始封装

思路分析

  1. 既然是库,那么可以先写一个匿名自执行函数(保护内部变量不受污染,定义和调用合为一体)
  2. 内部结构分析
    (a) 是需要外部调用,所以需要一个对外提供的接口
    (b) 需要选取元素,进行操作,所以做一个初始方法
    © 其它原型方法,比如点击,长按,滑动

开始操作

第一步:匿名自执行函数

	(function (window){ 
		//传入window,提高变量的查找效率
	})(window);

第二步:内部架构搭建

对外提供的接口 + 初始化方法

(function (window){ 
	function myMobile(selector){  //对外提供的接口。
	      //调用这个函数的原型对象上的_init方法,并返回
	      return myMobile.prototype._init(selector);
    }
    myMobile.prototype = {
        /*初始化方法,获取当前查找的对象*/
        _init: function (selector){
            if (typeof selector == "string"){
                //把查找到的元素存入到这个原型对象上。
                this.ele = window.document.querySelector(selector);
                //返回值其实就是原型对象。
                return this;
            }
        },
	  }
	})(window);

第三步:原型方法添加(全部的代码)

(function (window){  
    function myMobile(selector){  
        return myMobile.prototype._init(selector);
    }
    myMobile.prototype = {
        /*初始化方法,获取当前query对象的方法*/
        _init: function (selector){
            if (typeof selector == "string"){
                //把查找到的元素存入到这个原型对象上。
                this.ele = window.document.querySelector(selector);
                //返回值其实就是原型对象。
                return this;
            }
        },
        /*单击事件:
         * 为了规避click的300ms的延迟,自定义一个单击事件
        	触摸时间小于500ms为单击事件
         * */
        tap: function (handler){
            this.ele.addEventListener("touchstart", touchFn);
            this.ele.addEventListener("touchend", touchFn);

            var startTime,
                endTime;

            function touchFn(e){
                e.preventDefault()
                switch (e.type){
                    case "touchstart":
                        startTime = new Date().getTime();
                        break;
                    case "touchend":
                        endTime = new Date().getTime();
                        if (endTime - startTime < 500){
                            handler.call(this, e);
                        }
                        break;
                }
            }
        },
        /**
         * 长按
         * @param handler
         * 大于500ms为长按事件
         */
        longTag: function (handler){
            this.ele.addEventListener("touchstart", touchFn);
            this.ele.addEventListener("touchmove", touchFn);
            this.ele.addEventListener("touchend", touchFn);
            var timerId;

            function touchFn(e){
                switch (e.type){
                    case "touchstart" :  //500ms之后执行
                        timerId = setTimeout(function (){
                            handler.call(this, e);
                        }, 500)
                        break;
                    case "touchmove" :
                        //如果中间有移动也清除定时器
                        clearTimeout(timerId)
                        break;
                    case "touchend" :
                        //如果在500ms之内抬起了手指,则需要定时器
                        clearTimeout(timerId);
                        break;
                }
            }
        },
        /**
         * 左侧滑动。
         * 记录手指按下的左边,在离开的时候计算 deltaX是否满足左滑的条件         
         */
        slideLeft: function (handler){
            this.ele.addEventListener("touchstart", touchFn);
            this.ele.addEventListener("touchend", touchFn);
            var startX, startY, endX, endY;

            function touchFn(e){
                e.preventDefault();
                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方向的移动,并且x方向的移动大于25个像素,表示在向左侧滑动
                        if (Math.abs(endX - startX) >= Math.abs(endY - startY) && startX - endX >= 25){
                            handler.call(this, e);
                        }
                        break;
                }
            }
        },
        /* 右侧滑动 */
        rightLeft: function (e){
            //TODO: 这里交给自己diy
        }
    }
    //全局$赋值 可以直接调用
    window.$ = window.myMobile = myMobile;
})(window);

页面调用

<!DOCTYPE> 
<html lang="ZH-cn"> 
    <head>
        <meta charset="utf-8" >
        <title>标题</title>
        <meta name="keywords" content="关键字" /> 
        <meta name="description" content="网页描述" />
    <meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0;" name="viewport" />
    <script src="./event.js"></script>
    </head>
    <style>
     
    </style>
<body>
    
    <button>点我</button>
    <script>
            $("button").tap(function (e){
                console.log("单击事件")
            })
            $("button").longTag(function (){
                console.log("长按事件");
            })
            $("button").slideLeft(function (e){
                console.log(this);
                this.innerHTML = "左侧滑动了....."
            })    
    </script>
</body>
</html>

FAQ

大家在使用的时候可能会有一些疑问,比如说我左滑事件为什么会触发单击事件?一般实际业务中,不存在这种场景。如果有,某一个元素既有单击事件又有左滑事件,那做一个节流阀就ok了,做一个判断,如果是左滑或者右滑事件就禁止触发单击事件。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧阳呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值