Javascript - 跟踪鼠标位置

2022-08-30 01:00:32

我希望跟踪鼠标光标的位置,定期每t毫秒。因此,从本质上讲,当页面加载时 - 此跟踪器应该启动,并且(例如)每100毫秒,我应该获取posX和posY的新值并将其打印在表单中。

我尝试了以下代码 - 但值不会刷新 - 只有posX和posY的初始值显示在表单框中。关于如何启动和运行它的任何想法?

<html>
<head>
<title> Track Mouse </title>
<script type="text/javascript">
function mouse_position()
{
    var e = window.event;

    var posX = e.clientX;
    var posY = e.clientY;

    document.Form1.posx.value = posX;
    document.Form1.posy.value = posY;

    var t = setTimeout(mouse_position,100);

}
</script>

</head>

<body onload="mouse_position()">
<form name="Form1">
POSX: <input type="text" name="posx"><br>
POSY: <input type="text" name="posy"><br>
</form>
</body>
</html>

答案 1

鼠标的位置在事件处理程序接收的对象上报告,您可以将其附加到窗口(事件气泡):eventmousemove

(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
    }
})();

(请注意,它的主体只能在旧的IE上运行。if

上述操作示例 - 当您将鼠标拖到页面上时,它会绘制点。(在 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问题的回答似乎证实了这一点。

旁注:如果您要每100ms(10次/秒)做一些事情,请尝试将您在该函数中执行的实际处理保持在非常非常有限的位置。对于浏览器来说,这是很多工作,尤其是较旧的微软浏览器。是的,在现代计算机上,这似乎并不多,但是在浏览器中发生了很多事情......因此,例如,您可以跟踪您处理的最后一个位置,如果位置没有变化,请立即从处理程序中保释。


答案 2
onmousemove = function(e){console.log("mouse location:", e.clientX, e.clientY)}

打开控制台 (++),复制粘贴上面的代码,然后在浏览器窗口上移动鼠标。CtrlShiftJ