如何确定 onmousemove 事件的方向?

Posted

技术标签:

【中文标题】如何确定 onmousemove 事件的方向?【英文标题】:How to determine the direction on onmousemove event? 【发布时间】:2012-02-21 06:52:48 【问题描述】:

例如,在某些情况下,我想在鼠标按下时取消 onmousemove 事件。是否可以确定onmousemove 事件的方向? jQ或者JS都可以。

我有拖放元素。用户向上拖动元素。例如,如果元素的底部到达文档中的某个位置(即从文档顶部到500px),onmousemove 就会停止。如果用户尝试再次向上拖动元素,该功能将不会启动。此元素只能向下拖动。所以我认为通过捕捉mousemove 事件的方向很容易做到这一点。但是好像没有这样的标准属性。

【问题讨论】:

What have you tried so far?? 还没有。我虽然可能有一些鼠标事件的属性,我在 W3C 规范和 jQ 文档中找不到我自己。如果为此目的没有什么特别之处,我会尝试以不同的方式解决任务。但奇怪的是,它可能是非常有用的标准属性。 【参考方案1】:

event.movementX 是与前一个 positionX 的 px 差异,例如100 代表向右移动 100 像素,-100 代表向左移动等,0 代表没有移动。

【讨论】:

【参考方案2】:

有一些标准属性可以显示与之前的鼠标移动事件相关的增量:

document.addEventListener('mousemove', function (event) 
  directionX = event.movementX || event.mozMovementX || event.webkitMovementX || 0;
  directionY = event.movementY || event.mozMovementY || event.webkitMovementY || 0;
);

就像documentation中所说的:

MouseEvent.movementX 只读属性提供鼠标指针 X 坐标在该事件和前一个 mousemove 事件之间的偏移。

【讨论】:

这很好,但支持列表很小!【参考方案3】:

您可以保存最后一个mousemove 事件的位置以与当前位置进行比较:

//setup a variable to store our last position
var last_position = ,
$output       = $('#output');

//note that `.on()` is new in jQuery 1.7 and is the same as `.bind()` in this case
$(document).on('mousemove', function (event) 

    //check to make sure there is data to compare against
    if (typeof(last_position.x) != 'undefined') 

        //get the change from last position to this position
        var deltaX = last_position.x - event.clientX,
            deltaY = last_position.y - event.clientY;

        //check which direction had the highest amplitude and then figure out direction by checking if the value is greater or less than zero
        if (Math.abs(deltaX) > Math.abs(deltaY) && deltaX > 0) 
            //left
         else if (Math.abs(deltaX) > Math.abs(deltaY) && deltaX < 0) 
            //right
         else if (Math.abs(deltaY) > Math.abs(deltaX) && deltaY > 0) 
            //up
         else if (Math.abs(deltaY) > Math.abs(deltaX) && deltaY < 0) 
            //down
        
    

    //set the new last position to the current for next time
    last_position = 
        x : event.clientX,
        y : event.clientY
    ;
);

这是一个演示:http://jsfiddle.net/Dv29e/

更新

您还可以限制mousemove 事件以更全面地了解鼠标移动到的位置:

var last_position = ,
    $output       = $('#output'),
    mousemove_ok  = true,
    mouse_timer   = setInterval(function () 
        mousemove_ok = true;
    , 500);
$(document).on('mousemove', function (event) 
    if (mousemove_ok) 
        mousemove_ok = false;
        ...
    
);

这只会在以下情况下检查光标的位置与过去的位置:

    最后一个位置存在。 mousemove_ok 变量设置为 true,每半秒执行一次。

这是一个节流演示:http://jsfiddle.net/Dv29e/4/

【讨论】:

您需要考虑滚动。 感谢指正,clientXclientY 可能更合适。

以上是关于如何确定 onmousemove 事件的方向?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 jQuery 滚动事件的方向?

如何确定jQuery滚动事件的方向?

当使用事件处理程序时,事件前加on

onmousemove 事件不会从外部源触发?

在vue脚手架中元素绑定鼠标移动事件onmousemove,当鼠标按下拖拽元素,能在指定元素里左右移动,如何实现?

js移除onmousemove属性?