鼠标的位置报告在event
处理程序收到的对象mousemove
事件,您可以将其附加到窗口(事件冒泡):
(function() {
document.onmousemove = handleMouseMove;
function handleMouseMove(event) {
var eventDoc, doc, body;
event = event || window.event; // IE-ism
// If pageX/Y aren't available and clientX/Y are,
// calculate pageX/Y - logic taken from jQuery.
// (This is to support old IE)
if (event.pageX == null && event.clientX != null) {
eventDoc = (event.target && event.target.ownerDocument) || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = event.clientX +
(doc && doc.scrollLeft || body && body.scrollLeft || 0) -
(doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY +
(doc && doc.scrollTop || body && body.scrollTop || 0) -
(doc && doc.clientTop || body && body.clientTop || 0 );
}
// Use event.pageX / event.pageY here
}
})();
(请注意,该正文if
只能在旧版 IE 上运行。)
上述示例的实际应用- 当您在页面上拖动鼠标时,它会绘制点。 (在 IE8、IE11、Firefox 30、Chrome 38 上测试。)
如果您确实需要基于计时器的解决方案,可以将其与一些状态变量结合起来:
(function() {
var mousePos;
document.onmousemove = handleMouseMove;
setInterval(getMousePosition, 100); // setInterval repeats every X ms
function handleMouseMove(event) {
var dot, eventDoc, doc, body, pageX, pageY;
event = event || window.event; // IE-ism
// If pageX/Y aren't available and clientX/Y are,
// calculate pageX/Y - logic taken from jQuery.
// (This is to support old IE)
if (event.pageX == null && event.clientX != null) {
eventDoc = (event.target && event.target.ownerDocument) || document;
doc = eventDoc.documentElement;
body = eventDoc.body;
event.pageX = event.clientX +
(doc && doc.scrollLeft || body && body.scrollLeft || 0) -
(doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY +
(doc && doc.scrollTop || body && body.scrollTop || 0) -
(doc && doc.clientTop || body && body.clientTop || 0 );
}
mousePos = {
x: event.pageX,
y: event.pageY
};
}
function getMousePosition() {
var pos = mousePos;
if (!pos) {
// We haven't seen any movement yet
}
else {
// Use pos.x and pos.y
}
}
})();
据我所知,如果没有看到事件,您就无法获取鼠标位置,这这是另一个 Stack Overflow 问题的答案似乎证实了。
边注:如果您打算每 100 毫秒(10 次/秒)执行某件事,请尝试保留您在该函数中执行的实际处理非常非常有限。对于浏览器来说,这是一项繁重的工作,尤其是较旧的微软浏览器。是的,在现代计算机上,这看起来并不多,但浏览器中发生了很多事情......因此,例如,您可以跟踪您处理的最后一个位置,并在该位置没有发生时立即从处理程序中退出。 t 改变了。