关于拖拽函数的几个问题点

关于拖拽函数的几个问题点

# 具体遇到的问题
老师,您好,我想咨询一下其中一个代码为 var isTouchMove = false;视频中老师的解释为此代码为标志位

什么意思呢?我这边将关于标志位的代码删除以后,拖拽功能仍然是可以实现的,老师视频中的意思是,我们点击小图标的时候,虽然没有移动,但是触发了 function handleEnd(ev){}函数,怎么看出来的呢?

假设没有 var isTouchMove = false;这个标志位,如何看出function handleEnd(ev){}函数已经是被触发了呢?


# 报错信息的截图

 function handleMove(ev) {

                ev.preventDefault();

                isTouchMove = true;

                var touch = ev.changedTouches[0];

                var diffPoint = {};

                var movePoint = {

                    x: 0,

                    y: 0

                };

                diffPoint.x = touch.pageX - startPoint.x;

                diffPoint.y = touch.pageY - startPoint.y;

                if (options.x) {

                    movePoint.x = diffPoint.x + curPoint.x;

                }

                if (options.y) {

                    movePoint.y = diffPoint.y + curPoint.y;

                }

                move(el, movePoint.x, movePoint.y);

            }

ev.preventDefault();preventDefault表示阻止事件的默认行为,ev是function 传入的参数,这里还是有些理解不了,阻止的是什么行为呢? 阻止的是滚动条的默认行为,那么我在设定传入参数的时候,需不需要对ev进行一个定义呢?var ev=window.event || e; 我把这段代码加进去以后,好像也是不会报错的;老师,这个ev是不是属于行参?

# 相关课程内容截图

# 尝试过的解决思路和结果

# 粘贴全部相关代码,切记添加代码注释(请勿截图)

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">

    <title>2.4 单指拖拽--拖拽</title>

    <style>

        body {

            height: 2000px;

        }

        .backtop {

            position: fixed;

            right: 20px;

            bottom: 20px;

            width: 45px;

            height: 45px;

            line-height: 45px;

            text-align: center;

            background-color: rgba(0, 0, 0, 0.6);

            border-radius: 50%;

            color: #fff;

            font-size: 30px;

            -webkit-tap-highlight-color: transparent;

            /*transform: translate3d(x, y, 0);*/

        }

    </style>

</head>

<body>

    <a href="#" id="backtop" class="backtop">&uarr;</a>

    <script>

        function drag(el, options) {

            options.x = typeof options.x !== 'undefined' ? options.x : true;

            options.y = typeof options.y !== 'undefined' ? options.y : false;

            if (!options.x && !options.y) return;

            var curPoint = {

                x: 0,

                y: 0

            };

            var startPoint = {};

            var isTouchMove = false;

            el.addEventListener('touchstart', handleStart, false);

            el.addEventListener('touchmove', handleMove, false);

            el.addEventListener('touchend', handleEnd, false);

            function handleStart(ev) {

                var touch = ev.changedTouches[0];

                startPoint.x = touch.pageX;

                startPoint.y = touch.pageY;

            }

            function handleMove(ev) {

                ev.preventDefault();

                isTouchMove = true;

                var touch = ev.changedTouches[0];

                var diffPoint = {};

                var movePoint = {

                    x: 0,

                    y: 0

                };

                diffPoint.x = touch.pageX - startPoint.x;

                diffPoint.y = touch.pageY - startPoint.y;

                if (options.x) {

                    movePoint.x = diffPoint.x + curPoint.x;

                }

                if (options.y) {

                    movePoint.y = diffPoint.y + curPoint.y;

                }

                move(el, movePoint.x, movePoint.y);

            }

            function handleEnd(ev) {

                if (!isTouchMove) return;

                var touch = ev.changedTouches[0];

                curPoint.x += touch.pageX - startPoint.x;

                curPoint.y += touch.pageY - startPoint.y;

                isTouchMove = false;

            }

            function move(el, x, y) {

                x = x || 0;

                y = y || 0;

                el.style.transform = 'translate3d(' + x + 'px, ' + y + 'px, 0)';

            }

        }

    </script>

    <script>

        var backtop = document.getElementById('backtop');

        drag(backtop, {

            x: true,

            y: true

            // y: true

        });

    </script>

</body>

</html>

在这里输入代码,可通过选择【代码语言】突出显示

正在回答

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

1回答

同学你好,对于你的问题解答如下:

  1. 视频添加这个变量,主要是为了提升性能的,所以加不加这个变量,效果都是可以的显示。

  2. 因为点击图标的时候,表示触摸开始,那么当松开鼠标的时候,就表示触摸结束,可以在handleEnd事件中使用console.log()输出内容,方便测试。示例:

    http://img1.sycdn.imooc.com//climg/5fca057d09419cfd06560315.jpg

    http://img1.sycdn.imooc.com//climg/5fca059809ea04aa08990792.jpg

  3. 没有isTouchmove这个标识符,同样的可以在handleEnd函数中使用console.log()语句输出内容,测试是否触发了触摸结束事件。

    老师在第一条中已经解答过了,添加isTouchMove主要是为了提升性能。因为当我们并没有拖动改变图标的位置,只是点击了一下,那么此时我们是不希望执行handleEnd中的代码,所以才添加了标识符。

    示例:可以在判断语句的前后后面添加console.log语句,输出内容,方便查看结果

    当添加了isTouchMove标识符时

    http://img1.sycdn.imooc.com//climg/5fca078b0976f90706930287.jpg

    点击图标,没有拖动直接松开后,确实触发了touchend事件,但是不会执行后面的代码。

    http://img1.sycdn.imooc.com//climg/5fca07cc099c683e09100789.jpg

    当不添加isTouchMove标识符后

    http://img1.sycdn.imooc.com//climg/5fca07ff09a54c0510520786.jpg

    点击图标,没有拖动直接松开后,确实触发了touchend事件,同时也会执行后面的代码。

    http://img1.sycdn.imooc.com//climg/5fca081409c6984f09050773.jpg

  4. 阻止的浏览器默认行为就是滚动条。

  5. 如果事件函数中传了参数ev,那么不需要再对ev定义了。

  6. var ev=window.event || e; 把这段代码加进去以后不会报错,是因为window对象上默认有一个event属性,代表事件对象,它与传入的参数ev是一个意思,可以输出查看下:

    http://img1.sycdn.imooc.com//climg/5fca09c90946d2bf07260373.jpg

    http://img1.sycdn.imooc.com//climg/5fca09bc0981144e12670098.jpg

  7. 是的,ev表示形参,名字可以自定义。

祝学习愉快~

问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
3.WebAPP开发与小程序
  • 参与学习           人
  • 提交作业       622    份
  • 解答问题       6815    个

微信带火了小程序,也让前端工程师有了更多的展现机会,本阶段带你从移动基础知识的学习到webAPP开发,及小程序开发,让你PC端与移动端两端通吃。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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