2015-02-08 140 views
1

有没有使用mousemove事件来捕获游标碰撞的每个像素的方法?这样下面的条件会一直发生。Javascript mousemove事件触发

if(e.pageX == 100) 

我发现,如果鼠标快速移动然后跳过之间的像素。但是,如果我将它慢慢就会赶上像素一个接一个。

由于

+1

你到底想达到什么目的?如果将条件更改为'> =',则可以检测边缘。看到这里:http://jsfiddle.net/e0x2mmzc/ – bluefog 2015-02-08 08:45:12

回答

2

鼠标移动触发在每一个鼠标移动和目标是通过鼠标覆盖最上层,最嵌套元素。 当浏览器内部时间仅允许时,Mousemove,mouseover和mouseout触发。 这意味着如果快速移动鼠标,中间DOM元素和父母将被跳过。

因此,您可以移动元素而不触发鼠标移动/鼠标悬停。

您也可以从孩子通过家长移动,而不在父母任何鼠标事件的浏览器跳过中间的元素

你的唯一保证是,只要鼠标悬停被触发时,鼠标移出会触发过。

+0

我想检查每100px,看看左上角的元素是否通过如此:element.position()。left%100 == 0 – Aiden 2015-02-08 09:09:11

+0

正如我所说,它已经与像素无关,它是时间限制,可能因浏览器不同而不同,所以你不能指望它是一致的,**你不能假设**只能在1秒内处理10个鼠标移动事件,例如。 – Flot2011 2015-02-08 09:18:28

+0

是的,我知道:(只是以为有人可能知道工作。谢谢你的帮助anywayz。 – Aiden 2015-02-08 09:19:56

0

鼠标光标被选中,如果自上次的位置已经改变被触发mousemove事件,但仅与新检测到的位置。

你可以做的是存储最后一次已知的鼠标位置,并计算它与当前位置之间的一条直线来完成你的计算。 这并不需要太多的代码......一个简单的方法是

// Calls `f(x, y)` for each point starting from 
// `(x0, y0)` and ending in `(x1, y1)` (excluded) 
// moving along an 8-connected straight path. 
function processLine(x0, y0, x1, y1, f) { 
    var ix = x0 < x1 ? 1 : -1, dx = Math.abs(x1 - x0); 
    var iy = y0 < y1 ? 1 : -1, dy = Math.abs(y1 - y0); 
    var m = Math.max(dx, dy), cx = m >> 1, cy = m >> 1; 
    for (var i=0; i<m; i++) { 
     f(x0, y0); 
     if ((cx += dx) >= m) { cx -= m; x0 += ix; } 
     if ((cy += dy) >= m) { cy -= m; y0 += iy; } 
    } 
} 

,并可以作为

processLine(10, 20, 30, 35, function(x, y) { 
    console.log("x=" + x + ", y=", y); 
});