js模拟鼠标自动滑动滑块–dispatchEvent

  • Post author:
  • Post category:其他




initMouseEvent参数

event.initMouseEvent(type, canBubble, cancelable, view,

detail, screenX, screenY, clientX, clientY,

ctrlKey, altKey, shiftKey, metaKey,

button, relatedTarget);

形参

  1. type

    设置事件类型type 的字符串,包含以下几种鼠标事件:click,mousedown,mouseup,mouseover,mousemove,mouseout。
  2. canBubble

    是否可以冒泡。取值集合见Event.bubbles。
  3. cancelable

    是否可以阻止事件默认行为。取值集合见Event.cancelable。
  4. view

    事件的AbstractView对象引用,这里其实指向window 对象。取值集合见 UIEvent.view。
  5. detail

    事件的鼠标点击数量。取值集合见Event.detail (en-US)。
  6. screenX

    事件的屏幕的x坐标。取值集合见MouseEvent.screenX。
  7. screenY

    事件的屏幕的y坐标。取值集合见MouseEvent.screenY。
  8. clientX

    事件的客户端x坐标。取值集合见MouseEvent.clientX。
  9. clientY

    事件的客户端y坐标。取值集合见MouseEvent.clientY。
  10. ctrlKey

    事件发生时 control 键是否被按下。取值集合见MouseEvent.ctrlKey。
  11. altKey

    事件发生时 alt 键是否被按下。取值集合见MouseEvent.altKey。
  12. shiftKey

    事件发生时 shift 键是否被按下。取值集合见MouseEvent.shiftKey。
  13. metaKey

    事件发生时 meta 键是否被按下。取值集合见MouseEvent.metaKey。

    14.button

    鼠标按键值 button。
  14. relatedTarget

    事件的相关对象。只在某些事件类型有用 (例如 mouseover ?和 mouseout)。其它的传null。



使用dispatchEvent分发事件

var evObj = document.createEvent(‘MouseEvents’);

evObj.initMouseEvent(‘mousedown’, true, true)

fireOnThis.dispatchEvent(evObj);

evObj.initMouseEvent(‘mousemove’, true, true, window, null, null, null, 261, null);

fireOnThis.dispatchEvent(evObj);

evObj.initMouseEvent(‘mouseup’, true, true)

fireOnThis.dispatchEvent(evObj);



标题

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

<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }
        
        body {
            user-select: none;
            /*禁止用户选中*/
        }
        
        .wrap {
            width: 300px;
            height: 40px;
            background-color: #e8e8e8;
            margin: 100px auto;
            text-align: center;
            line-height: 40px;
            /*border-radius: 7px;*/
            position: relative;
        }
        
        .rect {
            position: relative;
            width: 300px;
            height: 100%;
        }
        
        .rec {
            position: absolute;
            top: 0;
            left: 0;
            width: 0;
            height: 100%;
            background: #00b894;
        }
        
        .silde {
            position: absolute;
            top: 0;
            left: 0;
            z-index: 11;
            box-sizing: border-box;
            width: 40px;
            height: 40px;
            background: #fff;
            border: 1px solid #ccc;
        }
    </style>
</head>

<body>
    <div class='wrap'>
        <div class='rec'>
            <div class='rect'>滑块验证
                <div class='silde'><img src="https://img-blog.csdnimg.cn/img_convert/2c7b3630606c742c1a3a8925eca0efd7.png" alt=""></div>
            </div>
        </div>
    </div>
    <script>
        window.onload = function() {
                var fireOnThis = document.querySelector('.silde');
                var evObj = document.createEvent('MouseEvents');
                evObj.initMouseEvent('mousedown', true, true)
                fireOnThis.dispatchEvent(evObj);
                evObj.initMouseEvent('mousemove', true, true, window, null, null, null, 261, null);
                fireOnThis.dispatchEvent(evObj);
                evObj.initMouseEvent('mouseup', true, true)
                fireOnThis.dispatchEvent(evObj);
            }
            //获取事件
        var silde = document.querySelector('.silde');
        var rec = document.querySelector('.rec');
        var rect = document.querySelector('.rect');
        var img = document.querySelector('img');
        var minusX; //保存变化的 X坐标(全局变量)

        //注册事件
        silde.onmousedown = function(e) { //鼠标点击事件,点击之后执行函数,获得点击位置的X坐标
            var initX = e.clientX; //保存初始按下位置的 X坐标;
            console.log("down", e); //用以测试
            document.onmousemove = function(e) { //鼠标移动事件
                console.log("move", e)
                var moveX = e.clientX;
                // var minusX = moveX - initX;    //变化的坐标(要注意作用域的问题,在这里面定义变量,在这个函数之外的函数就没法使用,所以要将minusX变成全局变量)
                minusX = moveX - initX;
                //这里注意一下,获得的minusX只是一个差值,没有单位想让 滑块的位置改变还需要加上 单位px
                //这个时候滑块会跟随鼠标整个页面一行的跑,价格条件判段,限制 滑块移动的区域不可以超过边框,保持left<=0。
                if (minusX < 0) {
                    // silde.style.left = '0';
                    minusX = 0;
                }
                if (minusX > 260) { //判断最大值
                    // silde.style.left = '251';
                    // 这里面的距离用边框长度减去 滑块的长度 300-49
                    minusX = 260;

                }
                silde.style.left = minusX + 'px';
                rec.style.width = minusX + 'px';
                if (minusX >= 260) {
                    rect.style.color = 'white';
                    img.src = 'https://img-blog.csdnimg.cn/img_convert/5f486ab64b48cb31df78ea4d7a9d7289.png';
                    document.onmousemove = null;
                    silde.onmousedown = null;
                    // rect.innerHTML = '验证成功';
                }
                // console.log(222,e,minusX);    //用以测试
            }
        }
        document.onmouseup = function(e) { //鼠标抬起事件
            document.onmousemove = null; //不允许鼠标移动事件发生
            console.log("up", e);
            if (minusX < 260) { //如果没有到头
                img.src = 'https://img-blog.csdnimg.cn/img_convert/2c7b3630606c742c1a3a8925eca0efd7.png';
                silde.style.left = 0; //设置一个 left值
                rec.style.width = 0; //绿色背景层设置宽度
            }
        }
    </script>
</body>

</html>



运行效果

运行效果



版权声明:本文为nizaili1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。