为了账号安全,请及时绑定邮箱和手机立即绑定

JavaScript-跟踪鼠标位置

JavaScript-跟踪鼠标位置

呼唤远方 2019-06-28 10:02:04
JavaScript-跟踪鼠标位置我希望每秒钟定期跟踪鼠标光标的位置。因此,从本质上说,当一个页面加载-这个跟踪器应该启动和(例如)每100毫秒,我应该得到新的值的POX和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>
查看完整描述

3 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

鼠标的位置在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
        }
    }})();

据我所知,你不可能在没有看到事件的情况下找到鼠标的位置对另一个堆栈溢出问题的回答似乎证实了。

旁注:如果您打算每100 ms执行一次(10次/秒),请尽量保持在该函数中所做的实际处理。非常有限..对于浏览器来说,这是一项很大的工作,尤其是较老的微软浏览器。是的,在现代电脑上它看起来不太像,但是浏览器中有很多事情发生.因此,例如,您可以跟踪您处理的最后一个位置,如果位置没有改变,您可以立即从处理程序处保释。


查看完整回答
反对 回复 2019-06-28
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

下面是一个基于jQuery和鼠标事件侦听器的解决方案(这比常规轮询要好得多):

$("body").mousemove(function(e) {
    document.Form1.posx.value = e.pageX;
    document.Form1.posy.value = e.pageY;})


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 932 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号