zoukankan      html  css  js  c++  java
  • 关于chrome浏览器事件拖动的bug(首次点击的时候也触发move的事件)

    在做R80web的时候出现一个奇怪的现象,chorme现在的版本还是存在,拖动事件有mousedown、mousemove、mouseup组成,但是首次click以及失去焦点再重新点击的时候同样会触发mousemove的事件

    事件问题代码

    $('#mydiv').on("mousedown",function(){
        console.log("this is mousedown event");
        $(document).on("mousemove",function(){
            console.log("this is mousemove event");
        });
        $(document).off("mouseup").on("mouseup",function(){
            console.log("this is mouseup event");
            $(document).off("mousemove")
        });
    });

    注:火狐版本的浏览器不会存在此问题

    问题存在,但是也要解决,因为这样一来,如果页面元素上有其他的事件,就有可能会触发mousemove的事件

    解决办法:

    在mousedown下申明一个变量,记录鼠标的位置,然后再在mousemove里面同位置判断,如果相同说明是点击的事件,否则为move事件

    代码:

    $('#mydiv').on("mousedown",function(e){
        var m=e.clientX,n=e.clientY;
        console.log("this is mousedown event");
        $(document).on("mousemove",function(e){
            var mousemove = { x: e.clientX, y: e.clientY };
            //如果前后位置相同说明是点击事件,否则移动事件
          if (m !== mousemove.x || n !== mousemove.y) {
                console.log("this is mousemove event");
            }
        });
        $(document).off("mouseup").on("mouseup",function(){
            console.log("this is mouseup event");
            $(document).off("mousemove")
        });
    });

    测试代码:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>测试chorme浏览器版本拖动问题</title>
    <script type="text/javascript" src="js/jquery-1.11.3.js"></script>
    </head>
    <body>
        <div id="mydiv" style="200px;height:200px;background: red;">
        <script>
            $(function(){
                //有问题的
                $('#mydiv').on("mousedown",function(){
                    console.log("this is mousedown event");
                    $(document).on("mousemove",function(){
                        console.log("this is mousemove event");
                    });
                    $(document).off("mouseup").on("mouseup",function(){
                        console.log("this is mouseup event");
                        $(document).off("mousemove")
                    });
                });
                //ok的
                $('#mydiv').on("mousedown",function(e){
                    var m=e.clientX,n=e.clientY;
                    console.log("this is mousedown event");
                    $(document).on("mousemove",function(e){
                        var mousemove = { x: e.clientX, y: e.clientY };
                        //如果前后位置相同说明是点击事件,否则移动事件
                      if (m !== mousemove.x || n !== mousemove.y) {
                            console.log("this is mousemove event");
                        }
                    });
                    $(document).off("mouseup").on("mouseup",function(){
                        console.log("this is mouseup event");
                        $(document).off("mousemove")
                    });
                });
            });
        </script>
    </body>
    </html>
    View Code

     问题延生:如何阻止冒泡,当我点击放大缩小图标的时候也触发拖动的事件

    解决办法:

    //窗口最大化的事件
    $("#expander .ipn-status").on("mousedown",function(){return false}).on("click","ipn-max",function(){
        //最大化的业务代码
        ...
    })

    注意:一定是要注销对应的事件才会有效果

    比如这样是没有效果的:

    //窗口最大化的事件
    $("#expander .ipn-status").on("click","ipn-max",function(){
        //最大化的业务代码
        ...
        return false;
    })

    上图功能代码:

    功能:

    1、点击右边图标控制放大缩小,缩小后显示放大图标,放大后显示缩小图标

    2、可以自由拖动事件主体,高度

    $(function(){
        var src_posi_Y = 0, dest_posi_Y = 0, move_Y = 0, is_mouse_down = true;    //事件窗体拖拽
        $("#expander").mousedown(function(e){
            console.log("点击");
            $("#mask").css('display','block');//开启临时遮罩层
            src_posi_Y = e.pageY;
            var m=e.clientX;
            var n=e.clientY;
            is_mouse_down = true;
            $(document).on('mousemove',function(e){
                var mousemove = { x: e.clientX, y: e.clientY };
                if (m !== mousemove.x || n !== mousemove.y) {//如果mousemove鼠标的位置和mouseDown鼠标位置相同说明不是move事件
                    console.log("移动");
                    dest_posi_Y = e.pageY;//鼠标距离顶部的距离
                    var maxPosiY=$("#top").height()+$("#top_nav").height()+$("#expander").height();//间距
                    var mm=dest_posi_Y-maxPosiY;
                    if(mm<0){mm=0}
                    //根据距离页面顶端位置进行判断时候终止拖拽
                    if(dest_posi_Y<=maxPosiY){
                        dest_posi_Y=maxPosiY;
                        $("#expander").find(".ipn-max").hide()//隐藏最大化图标
                        $("#expander").find(".ipn-default").css("display","inline-block")//显示默认图标
                    }
                    src_posi_Y = dest_posi_Y;
                    $("#event").removeClass("half").removeClass("all");
                    $("#event").css("top",mm+"px" );
                }
            });
            $(document).off("mouseup").on("mouseup",function(e){
                console.log("弹起");
                $("#mask").css('display','none');//关闭临时遮罩层
                $(document).off("mousemove");
            })
        });
    
        //窗口最大化的事件
        $("#expander .ipn-status").on("mousedown",function(){return false}).on("click",".ipn-max",function(){//阻止冒泡
            //var maxPosiY=parseFloat($("#main").height()-40)+"px";
            $(this).hide();
            $("#expander").find(".ipn-default").css("display","inline-block");
            $("#event").removeClass("half").addClass("all");
            return false;
        })
        //窗口还原的事件
        $("#expander .ipn-status").on("mousedown",function(){return false}).on("click",".ipn-default",function(){//阻止冒泡
            $(this).hide();
            $("#expander").find(".ipn-max").css("display","inline-block")
            $("#event").removeClass("all").addClass("half");
            return false;
        })
    })

    css

    @charset "utf-8";
    *{
        margin:0px;
        padding:0px;
    }
    html,body{
        background-color: #f9fbf8;
        height:100%
    }
    p{margin:0;}
    .lf   {float:left;}
    .rt  {float:right;}
    .clear  {clear:both;}
    ul,li,p,h1,h2,h3,h4,h5,h6,dl,dt,dd {
        margin:0px;
        padding:0px;
        border:none;
        list-style:none;
    }
    button{outline: none}
    a{text-decoration: none}
    
    
    
    /*实时告警*/
    .foot_nav{
        height: 40px;
        width: 100%;
        text-align: center;
        line-height: 40px;
        color: #7d7a7a;
        background-color:rgba(0, 0, 0, 0.05);
        position: absolute;
        bottom: 0;
        z-index: 99;
        font-size: 12px;
    }
    /*实时告警*/
    .event{
        position: absolute;
        width: 100%;
        color: #7d7a7a;
        background-color: #ffffff;
        bottom: 40px;
        z-index: 99;
        font-size: 12px;
        display: none;
        /* transition: top 0.3s; */
    }
    .event.half{
        top:60% !important
    }
    .event.all{
        top:0 !important
    }
    .event.default{
        top:100% 
    }
    .showEvent span{
        display: block;
        margin-left: 10px;
    }
    .showEvent{
        height: calc(100% - 22px);
        overflow: auto;
    }
    #expander{
        width: 100%;
        height: 25px;
        background-color: #f3f3f3;
        border-radius: 5px;
        border: 1px solid #eee;
        line-height: 25px;
    }
    #expander:hover{ cursor:n-resize;}
    .ipn-tools>li{
        display:inline-block;
        vertical-align: top;
        margin-left:20px;
    }
    #iframe{
        height:100%;
    }
    
    #expander .ipn-tools{
        height:25px;
        line-height:25px;
    }
    #expander .ipn-tools a{
        display:inline-block;
        height:100%;
        text-align:center;
        color: #7d7a7a;
        width: 60px;
        height: 24px;
        border: 1px solid #8a8a8a;
        background-color: #ddd;
    }
    #expander .ipn-tools li input{
        vertical-align: middle;
        margin:0px 3px 3px 0px;
    }
    
    div.ipn-status{
        margin-right:20px;
        height: 25px;
        line-height: 29px;
    }
    div.ipn-status>i{
        display:inline-block;
        padding:7px;
        font-style: normal;
        margin-right: 10px;
        cursor: pointer;
    }
    div.ipn-status>i:hover{
        transform: scale(1.1);
    }
    div.ipn-status>i.ipn-close:hover{
        transform: scale(1.2);
    }
    div.ipn-status>i.ipn-max{
        background-image: url(../image/max.png)
    }
    div.ipn-status>i.ipn-default{
        display:none;
        background-image: url(../image/min.png)
    }
    div.ipn-status>i.ipn-close{
        transform: scale(1.1);
        padding:6px;
        background-image: url(../image/close.png);
        margin: 0 0 1px 0px;
    }
    View Code

    html

    <div id="event" class="event half">
    <div id="expander">
        <h5 class="lf" style="margin-left:15px">实时告警</h5>
        <ul class="ipn-tools lf">
            <li>
                <a href="javascript:;">清除告警</a>
            </li>
            <li>
                <label>
                    <input type="checkbox" name="" value="">本次不再弹框
                </label>
            </li>
            <li>
                <label>
                    <input type="checkbox" name="" value="">不再接受任何告警信息
                </label>
            </li>
            <li></li>
        </ul>
        <div class="ipn-status rt">
            <i class="ipn-max" title="最大化"></i>
            <i class="ipn-default" title="还原"></i>
            <i class="ipn-close" title="关闭"></i>
            <div class="clear"></div>
        </div>
    </div>
    <div class="showEvent">
        <span>事件1</span>
        <span>事件2</span>
        <span>事件3</span>
        <span>事件4</span>
    </div>
    </div>
    View Code
  • 相关阅读:
    Privacy Policy
    privacy
    将一个无法一次读入内存的大文件排序
    java实现二叉树的非递归遍历
    java静态方法同步问题
    关于java静态方法继承问题
    Android 代码写布局
    Android自定义ImageView实现手势放大图片的控件,无需依赖任何第三方。
    Gradle版本更换问题
    Android的AlertDialog实现圆角边框
  • 原文地址:https://www.cnblogs.com/pengfei25/p/10431419.html
Copyright © 2011-2022 走看看