登录  /  注册
首页 > web前端 > js教程 > 正文

jQuery中关于title属性导致触发mousedown事件时连带触发mousemove事件详解

黄舟
发布: 2017-06-28 10:28:34
原创
1611人浏览过

  大家都知道,鼠标点击的整个事件的执行流程是:mousedown -> mouseup -> click ,而拖放的整个流程是:mousedown -> mousemove -> mouseup -> click

  可以来看一个正常 demo,可以分别测试点击和拖放动作

$(function(){    //初始化 box 位置
    $('#box').css('left', ($(window).width() - 100) / 2).css('top', ($(window).height() - 100) / 2).show();    var x = y = 0;    var isMove = false;
    $('#box').mousedown(function(e){
        x = e.clientX - $('#box').offset().left;
        y = e.clientY - $('#box').offset().top;
        $(document).mousemove(function(e){
            $('#tip').text('你触发了 mousemove 事件');
            isMove = true;
            l = e.clientX - x;
            t = e.clientY - y;
            $('#box').css('left', l).css('top', t);
        }).mouseup(function(){
            $(document).unbind('mousemove').unbind('mouseup');
        });
    });
    $('#box').click(function(e){        if(!isMove){
            $('#tip').text('你触发了 click 事件');
        }
        isMove = false;
    });
});
登录后复制
登录后复制

  我们试着给 #box 加上title属性再来分别试试点击事件和拖放事件

$(function(){    //初始化 box 位置
    $('#box').css('left', ($(window).width() - 100) / 2).css('top', ($(window).height() - 100) / 2).show();    var x = y = 0;    var isMove = false;
    $('#box').mousedown(function(e){
        x = e.clientX - $('#box').offset().left;
        y = e.clientY - $('#box').offset().top;
        $(document).mousemove(function(e){
            $('#tip').text('你触发了 mousemove 事件');
            isMove = true;
            l = e.clientX - x;
            t = e.clientY - y;
            $('#box').css('left', l).css('top', t);
        }).mouseup(function(){
            $(document).unbind('mousemove').unbind('mouseup');
        });
    });
    $('#box').click(function(e){        if(!isMove){
            $('#tip').text('你触发了 click 事件');
        }
        isMove = false;
    });
});
登录后复制
登录后复制

  可以发现点击也会触发 mousemove 事件,原因就在于 title。

  并且 title 属性有个特性,就是在你鼠标按下的时候,提示文字会隐藏,鼠标抬起则又显示,所以你可以尝试下双击,会发现第 2 次点击会触发 click 事件,因为第 1 次点击后 title 还没有显示出来就进行了第 2 次点击,则正常触发 click 事件。

  发现这一点后,我们就可以试着避免这个小问题,因为在一些情况下,一个对象可能需要同时具备拖放和点击功能,并且保证这两个功能不会冲突。最简单的办法就是避免使用 title 属性,或者你可以参考我在 HoorayOS 里的实现:

  在 mousedown 和 mouseup 时分别记录对象的坐标,并进行对比,如果完全一致则表示对象未进行拖动,否则代表对象已经拖动,这时就可以在 mouseup 里分别处理这两种情况。

  PS:该问题目前仅在 chrome 下发现有,其他浏览器似乎没有出现。

以上就是jQuery中关于title属性导致触发mousedown事件时连带触发mousemove事件详解的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号