封装移动端的轻敲事件

谁若孜孜于寻找,就越容易迷失自己。一切孤独皆是罪过。

介绍一下怎么去封装移动端的轻敲事件,也就是pc端的点击事件

  1. 为什么封装 :
    • 首先为什么封装轻敲事件
    • 因为在移动端click事件会有300ms 的延迟,用户体验不好,
    • 所以我们根据移动端的三大时间类封装一个tap(统称)事件
  2. 需求 :
    • 在tap事件发生的时候,不能触发touchmove 事件
    • touchend发生的时间 — toouchstart发生的时间 < 150ms
  3. 移动端的轻敲事件 :
    • @param {Object} el 发生事件的元素
    • @param {Function} fn 事件处理函数

代码实现 :

     <script>
            // 1.  首先为什么封装轻敲事件
            // 因为在移动端click事件会有300ms 的延迟,用户体验不好,
            // 所以我们根据移动端的三大时间类封装一个tap(统称)事件
    
            // 2. 需求需求
            // 在tap事件发生的时候,不能触发touchmove 事件
            // touchend发生的时间 --- toouchstart发生的时间 < 150ms
    
            function tap(ele, fn) {
                var startTime;
                var flag = false;
    
                // 在轻敲事件开始的时候记录一下时间 由于后面也要使用,所以使用全局变量
                ele.addEventListener('touchstart', function() {
                    // 将获取的时间转化为时间戳
                    startTime = new Date().getTime();
                    console.log(startTime); // 1533460365267
                });
    
                // 在tap事件发生的时候,不能触发touchmove 事件,这该怎么办呢?
                // 知道 flag 吗? 来一个开关
                ele.addEventListener('touchmove', function() {
                    // 如果进入这里面的话,将开关重新赋值
                    flag = true;
                });
    
                // 当手指与屏幕离开的时候
                ele.addEventListener('touchend', function() {
                    // 记录结束的时间
                    var endTime = new Date().getTime();
                    // 怎样才能出发轻敲事件呢? 是不是得使 tap 的条件成立
                    if (flag == false && endTime - startTime < 150) {
                        fn();
                    }
                })
    
            }
    
            var html = document.documentElement;
            tap(html, function(e) {
                console.log(e);
                console.log(this);
            });
        </script>

上面封装好了,但是有很多细节问题

  • 当调用一个函数的时候 如果有形参 没有实参 形参的值为undefined , 如果是undefined的时候是不是就会报错,所以呢? 进行判断
  • 注意观察这里的代码与上面的有什么不同
    ele.addEventListener('touchend', function() {
                    // 记录结束的时间
                    var endTime = new Date().getTime();
                    // 怎样才能出发轻敲事件呢? 是不是得使 tap 的条件成立
                    if (flag == false && endTime - startTime < 150) {
                        fn && fn();
                        // 这是什么意识,js中的并且运算符,两边都为真的时候,才能够触发,
                    }
                })

还有一个问题,就是节点的问题,js中最常见的三个节点 : 文本节点,元素节点,属性节点

所以~~还得进行判断,一步到位

    <!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>
    </head>
    
    <body>
        <script>
            // 1.  首先为什么封装轻敲事件
            // 因为在移动端click事件会有300ms 的延迟,用户体验不好,
            // 所以我们根据移动端的三大时间类封装一个tap(统称)事件
    
    
            // 2. 需求需求
            // 在tap事件发生的时候,不能触发touchmove 事件
            // touchend发生的时间 --- toouchstart发生的时间 < 150ms
    
    
            function tap(ele, fn) {
                // 如果el身上有nodeType属性 并且属性值为1的话
                if (ele.nodeType && ele.nodeType == 1) {
                    var startTime;
                    var flag = false;
    
                    // 在轻敲事件开始的时候记录一下时间 由于后面也要使用,所以使用全局变量
                    ele.addEventListener('touchstart', function() {
                        // 将获取的时间转化为时间戳
                        startTime = new Date().getTime();
                        console.log(startTime); // 1533460365267
                    });
    
                    // 在tap事件发生的时候,不能触发touchmove 事件,这该怎么办呢?
                    // 知道 flag 吗? 来一个开关
                    ele.addEventListener('touchmove', function() {
                        // 如果进入这里面的话,将开关重新赋值
                        flag = true;
                    });
    
                    // 当手指与屏幕离开的时候     // 这里的 e 是浏览器传进来的事件对象,
                    ele.addEventListener('touchend', function(e) {
                        // 记录结束的时间
                        var endTime = new Date().getTime();
                        // 怎样才能出发轻敲事件呢? 是不是得使 tap 的条件成立
                        if (flag == false && endTime - startTime < 150) {
                            // 因为是自己调用的自己,没有事件对象,那该怎么办呢?谁有事件对象? touchend 有,手指离开那个元素,这就是事件对象
                            // 这里是函数调用 , 所以这里的 e 是实参
                            // 还需要是函数调用的时候,将这个this指向这个事件对象
                            fn && fn.call(ele, e);
                        }
                    })
    
                } else {
                    // 进行一个警告
                    console.warn('轻敲事件的第一个参数必须是元素对象类型');
                }
    
            }
    
            var html = document.documentElement;
    
            // 注意这里的函数只是一个普通函数,没有事件对象,如果我们信息网有一个事件对象,哪该怎么办呢?
            // 是不是应该在调用的时候传进来呢! 这里是形参
            tap(html, function(e) {
                console.log(e);
                console.log(this);
            });
        </script>
    </body>
    
    </html>

好了,tap事件就封装好了.好好回顾一下!!!
在此附上我的QQ: 2489757828 有问题的话可以一同探讨
我的私人博客: 李大玄

猜你喜欢

转载自blog.csdn.net/weixin_43553701/article/details/93386836