弹框拖动功能 && mouseup事件丢失

对于某区域的拖动功能主要用到mousedown,mousemove和mouseup事件,具体代码如下:

function pauseEvent(e){
    if(e.stopPropagation) e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    e.cancelBubble=true;
    e.returnValue=false;
    return false;
}
$('.selectMajor .co_tit').mousedown(function(ev){
    var e = ev||event;
    pauseEvent(e);
    var mdX = e.clientX;
    var mdY = e.clientY;
    var ele_top = $('.selectMajor').position().top;
    var ele_left = $('.selectMajor').position().left;
    var ele_width = $('.selectMajor').width();
    var ele_height = $('.selectMajor').height();
    var win_width = $(window).width();
    var win_height = $(window).height();
    // IE8 取消默认行为-设置全局捕获
    if ($('.selectMajor .co_tit').setCapture) {
        $('.selectMajor .co_tit').setCapture();
    }
    document.onmousemove = function(ev2) {
        var e2 = ev2||event;
        pauseEvent(e2);
        var mmX = e2.clientX;
        var mmY = e2.clientY;
        var moveX = mmX-mdX;
        var moveY = mmY-mdY;
        var target_top = ((ele_top+moveY) > (win_height-ele_height)) ? (win_height-ele_height) : (ele_top+moveY)
        target_top = target_top < 0 ? 0 : target_top
        var target_left = (ele_left+moveX-400) < 0 ? 400 : ( (ele_left+moveX-400)>(win_width-ele_width) ? (win_width-ele_width+400) : ele_left+moveX )
        $('.selectMajor').css('top',target_top+'px');
        $('.selectMajor').css('left',target_left+'px');
    }
})
document.onmouseup = function() {
    document.onmousemove = null;
    // 释放全局捕获
    if ($('.selectMajor .co_tit').releaseCapture) {
        $('.selectMajor .co_tit').releaseCapture();
    }
}

在测试时会发现,如果不加pauseEvent方法时,会出现时常mouseup事件丢失的情况。具体原因:

  • 触发了浏览器的 drag 操作,导致mouseup丢失。
  • 由于鼠标离开了操作的区域,触发了mouseleave导致mouseup丢失。

加的pauseEvent方法就是用来防止触发drag操作的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   JavaScript 与 HTML 之间的交互是通过事件实现的。   事件,就是文档或浏览器窗口中发生的一些特...
    霜天晓阅读 3,538评论 1 11
  • 本节介绍各种常见的浏览器事件。 鼠标事件 鼠标事件指与鼠标相关的事件,主要有以下一些。 click 事件,dblc...
    许先生__阅读 2,499评论 0 4
  • 本篇博客源地址 总结: 鼠标事件 1.click与dbclick事件ele.click()ele.click(ha...
    ZombieBrandg阅读 683评论 0 1
  • 总结: 鼠标事件 1.click与dbclick事件$ele.click()$ele.click(handler(...
    阿r阿r阅读 1,631评论 2 10
  • 在前端开发过程中,页面交互过程和事件机制密不可分,一直以来对于事件相关机制了解的不够深刻,没有好好进行了解,最近花...
    Patrick浩阅读 1,713评论 0 2