Javascript - 跟踪鼠标位置

Har*_*ari 138 javascript

我希望每隔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>
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 158

鼠标的位置报告在事件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
    }
})();
Run Code Online (Sandbox Code Playgroud)

(注意,它的主体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
        }
    }
})();
Run Code Online (Sandbox Code Playgroud)

据我所知,你不能在没有看到事件的情况下获得鼠标位置,这对另一个Stack Overflow问题的答案似乎证实了这一点.

旁注:如果你要每100毫秒(10次/秒)做一些事情,尽量保持你在该功能中的实际处理非常非常有限.这对于浏览器来说是很多工作,尤其是较旧的Microsoft浏览器.是的,在现代计算机上看起来并不多,但浏览器中有很多...例如,如果位置没有,你可以跟踪你处理的最后一个位置并立即从处理程序保释改变了.


sol*_*dil 64

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

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

  • 当我无缘无故地得到负面投票时,这真让我感到不安......我的答案很有用,或者与被接受的答案大致相同.我希望人们在downvoting时评论他们的原因. (28认同)
  • 我绝对同意你的意见.作为原始海报,我当然不觉得你应该得到一个downvote. (5认同)
  • 为什么跟踪您确定的值并没有改变?我不明白,除非是家庭作业问题.使用事件方法,您可以跟踪这些值的每个更改,然后在其他地方执行100毫秒轮询,如果您需要为任何目的处理这些值. (3认同)
  • @PattycakeJr,如果你指向 CDN,那么你“超级”不太可能下载它,因为几乎所有其他网站都链接到它 (2认同)

Reg*_*Boy 36

onmousemove = function(e){console.log("mouse location:", e.clientX, e.clientY)}
Run Code Online (Sandbox Code Playgroud)

打开控制台(Ctrl + Shift + J),复制粘贴上面的代码并在浏览器窗口上移动鼠标.

  • 伊莫是最佳答案 (5认同)
  • `onmousemove = (e) =&gt; console.log("鼠标位置:", ex, ey)` (3认同)

dGR*_*MOP 11

我相信我们正在过度思考这个,

function mouse_position(e)
{
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
<body onmousemove="mouse_position(event)"></body>
Run Code Online (Sandbox Code Playgroud)

  • 我也对没有任何解释的downvotes感到恼火.为了给出可能的解释,这个答案没有解决OP每100毫秒轮询的问题.他对其他答案的回答更清楚,这是必要的. (10认同)
  • 你是对的...我的awnser是偏爱的 (5认同)

小智 8

我认为他只想知道光标的X/Y位置而不是为什么答案那么复杂.

// Getting 'Info' div in js hands
var info = document.getElementById('info');

// Creating function that will tell the position of cursor
// PageX and PageY will getting position values and show them in P
function tellPos(p){
  info.innerHTML = 'Position X : ' + p.pageX + '<br />Position Y : ' + p.pageY;
}
addEventListener('mousemove', tellPos, false);
Run Code Online (Sandbox Code Playgroud)
* {
  padding: 0:
  margin: 0;
  /*transition: 0.2s all ease;*/
  }
#info {
  position: absolute;
  top: 10px;
  right: 10px;
  background-color: black;
  color: white;
  padding: 25px 50px;
}
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>
  
  <body>
    <div id='info'></div>
        </body>
  </html>
Run Code Online (Sandbox Code Playgroud)


Paw*_*ore 8

如果有人还在寻找答案,

function track(e) {
  console.log("X - ", e.pageX, " Y - ", e.pageY);
}
addEventListener("mousemove", track, false);
Run Code Online (Sandbox Code Playgroud)

将此代码粘贴到控制台中以查看立即操作


obo*_*hto 5

基于ES6的代码:

let handleMousemove = (event) => {
  console.log(`mouse position: ${event.x}:${event.y}`);
};

document.addEventListener('mousemove', handleMousemove);
Run Code Online (Sandbox Code Playgroud)

如果您需要通过限制来移动鼠标,请使用以下命令:

let handleMousemove = (event) => {
  console.warn(`${event.x}:${event.y}\n`);
};

let throttle = (func, delay) => {
  let prev = Date.now() - delay;
  return (...args) => {
    let current = Date.now();
    if (current - prev >= delay) {
      prev = current;
      func.apply(null, args);
    }
  }
};

// let's handle mousemoving every 500ms only
document.addEventListener('mousemove', throttle(handleMousemove, 500));
Run Code Online (Sandbox Code Playgroud)

这是例子


小智 5

如果只想直观地跟踪鼠标移动:

<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<style type="text/css">
* { margin: 0; padding: 0; }
html, body { width: 100%; height: 100%; overflow: hidden; }
</style>
<body>
<canvas></canvas>

<script type="text/javascript">
var
canvas    = document.querySelector('canvas'),
ctx       = canvas.getContext('2d'),
beginPath = false;

canvas.width  = window.innerWidth;
canvas.height = window.innerHeight;

document.body.addEventListener('mousemove', function (event) {
	var x = event.clientX, y = event.clientY;

	if (beginPath) {
		ctx.lineTo(x, y);
		ctx.stroke();
	} else {
		ctx.beginPath();
		ctx.moveTo(x, y);
		beginPath = true;
	}
}, false);
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)


Jon*_*nas 5

只是@TJ Crowder@RegarBoy的简化版本答案。

在我看来,少即是多。

查看onmousemove 事件以获取有关该事件的更多信息。

图像鼠标跟踪器

每次鼠标根据水平和垂直坐标移动时posXposY都会有一个新的和值。

<!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>Example Mouse Tracker</title>
      <style>    
        body {height: 3000px;}
        .dot {width: 2px;height: 2px;background-color: black;position: absolute;}
      </style>
    </head>
    <body>
    <p>Mouse tracker</p>
    <script>
    onmousemove = function(e){
        //Logging purposes
        console.log("mouse location:", e.clientX, e.clientY);

        //meat and potatoes of the snippet
        var pos = e;
        var dot;
        dot = document.createElement('div');
        dot.className = "dot";
        dot.style.left = pos.x + "px";
        dot.style.top = pos.y + "px";
        document.body.appendChild(dot);
    }      
    </script>
    </body>
    </html>
Run Code Online (Sandbox Code Playgroud)