请问老师,这是什么问题?正常吗?

请问老师,这是什么问题?正常吗?

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        div {
            width: 200px;
            height: 200px;
            background-color: brown;
            margin: 300px auto;
        }
    </style>
</head>

<body>
    <div id="box"></div>
</body>
<script>
    const box = document.getElementById('box');
    class SWIPE {
        constructor(ele, start={}, isdefault = { time: 500, distance: 100 }) {
            this.ele = ele;
            this.start = start;
            this.isdefault = isdefault;
        }

        // 开始点击
        startdown() {
            const ele = this.ele;
            // console.log(ele);
            ele.addEventListener('touchstart',(evt)=>{
                evt.preventDefault();
            })
            ele.addEventListener('pointerdown',(evt)=>{
                this.pressdown(evt);
            },false);
        }

        // 点击后其他事件
        pressdown(evt) {
            this.start.time=new Date().getTime();
            this.start.x=evt.pageX;
            this.start.y=evt.pageY;
        //    console.log(this.start);
            document.addEventListener('pointerup',(evt)=>{
                this.endHandler(evt)
            },false);
            document.addEventListener('pointercancel',(evt)=>{
                this.endHandler(evt)
            },false);
        }
        //endHandler()结束事件
        endHandler(evt){
            const differ={};
            let direction='';
            differ.time=new Date().getTime()-this.start.time;
            differ.x=evt.pageX-this.start.x;
            differ.y=evt.pageY-this.start.y;
            // console.log(differ.time,Math.abs(differ.x),Math.abs(differ.y));
            document.removeEventListener('pointerup',(evt)=>{
                this.endHandler(evt)
            },false);
            document.removeEventListener('pointercancel',(evt)=>{
                this.endHandler(evt)
            },false);  
            this.isSwipe(differ,direction)
        }

        //判断是否是扫动手势
        isSwipe(differ,direction){
            const isdefault= this.isdefault;
            if(differ.time>isdefault.time||(Math.abs(differ.x)<isdefault.distance&&
            Math.abs(differ.y)<isdefault.distance)){
                return;
            }else{
                //判断方向
                if(Math.abs(differ.x)>=Math.abs(differ.y)){
                    if(differ.x>0){
                        direction='→';
                    }else{
                        direction='←';
                    }
                }else{
                    if(differ.y>0){
                        direction='↓';
                    }else{
                        direction='↑';
                    }
                }
            }
            console.log(direction);

        }
    }

    const p = new SWIPE(box);
    p.startdown();
</script>

</html>

你好老师,左右上下扫和45度角去扫会触发很多次这是为什么?是不是因为鼠标按下后里面的方法一直在触发的缘故?怎么处理呢?是不是跟轮播图点击添加节流锁一个原理?

正常扫如图:https://img1.sycdn.imooc.com//climg/6436d54a095eb4e301400147.jpg

45度往角上扫:

https://img1.sycdn.imooc.com//climg/6436d58a0953f8b600920228.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,这是由于pointerup事件处理函数没有被成功清理造成的。由于上一次的pointerup等事件没被清理,导致事件重复添加,因此打印了多个结果:

https://img1.sycdn.imooc.com//climg/64376b610947024707640458.jpg

可以使用一个特殊的关键字bind,辅助我们清除重复事件。bind用来改变函数中的this指向:

https://img1.sycdn.imooc.com//climg/64376ca8091b920c08540230.jpg

具体如下:

https://img1.sycdn.imooc.com//climg/64376bbd098ec1ce08370264.jpg

https://img1.sycdn.imooc.com//climg/64376c0409b5907b09480643.jpg

https://img1.sycdn.imooc.com//climg/64376c5209b9b10709720446.jpg

祝学习愉快!

  • 慕仙7313728 提问者 #1

    你好老师,这里bind为什么指向的是实例?不了解bind,网上查了一下,有点看不懂。

    2023-04-14 22:16:48
  • 慕仙7313728 提问者 #2

    你好老师,这里bind(this)为什么可以指向实例,不太了解。能讲解一下吗?

    2023-04-14 22:18:21
  • 好帮手慕久久 回复 提问者 慕仙7313728 #3

    解答如下:

    bind只是单纯的改变函数内的this指向,并返回改变this后的函数,不会调用函数。比如:

    下图中,fn中有this,那么可以通过bind指定this指向谁,比如指向obj。得到的newFn就是一个和fn长得一模一样,但是this不同的函数:

    https://img1.sycdn.imooc.com//climg/61e28c4609c9482707270402.jpg

    https://img1.sycdn.imooc.com//climg/61e28c49090b96f604060217.jpg

    敲一下例子,体会下。属于拓展,简单了解就行。

    2023-04-17 10:17:43
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师