我尝试了以下代码-但未刷新值-表单框中仅显示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 楼
在处理程序接收到的event
事件的报告的mousemove
对象上报告了鼠标的位置,您可以将其附加到窗口(事件气泡):表示该
if
的正文只能在旧版IE上运行。)以上示例的作用-当您将鼠标拖动到页面上方时,它会绘制点。 (在IE8,IE11,Firefox 30,Chrome 38上进行了测试。)
如果您确实需要基于计时器的解决方案,请将其与一些状态变量结合使用: br />
据我所知,如果没有看到事件,就无法获得鼠标的位置,这似乎是对另一个Stack Overflow问题的回答。
旁注:如果您打算每100毫秒(10次/秒)执行某项操作,请尝试使该功能中的实际处理非常非常有限。对于浏览器,这是很多工作,尤其是较旧的Microsoft。是的,在现代计算机上看起来不多,但是浏览器中发生了很多事情。因此,例如,您可以跟踪上一个处理的位置,如果位置不正确则立即从处理程序中保释。 t已更改。
#2 楼
这是一个基于jQuery和主体上的鼠标事件侦听器(比常规轮询要好得多)的解决方案:$("body").mousemove(function(e) {
document.Form1.posx.value = e.pageX;
document.Form1.posy.value = e.pageY;
})
评论
正如我已经提到的,定期轮询正是我想要做的。我没有跟踪鼠标事件的变化,我只是想每隔x毫秒捕获一次鼠标位置(无论鼠标是否移动)。
–哈里
2011-10-17 7:53
为什么跟踪您肯定知道的值没有改变?我不明白,除非是家庭作业问题。使用event方法,您可以跟踪这些值的每次更改,然后如果需要出于任何目的处理这些值,则在其他位置进行100ms轮询。
–索伦迪尔
2011年10月17日7:57
除了不必要地使用5mb JS库之外,这里使用jQuery没有优势。
–小蛋糕
19年4月5日在21:38
@PattycakeJr我上次看它的缩略版不到90kB
–克里斯
19年5月9日15:33
如果您指向CDN,那么@PattycakeJr也是极不可能下载的东西,因为几乎所有其他站点都链接到它
–布莱恩·利什曼(Brian Leishman)
19年6月6日在22:10
#3 楼
onmousemove = function(e){console.log("mouse location:", e.clientX, e.clientY)}
打开控制台(Ctrl + Shift + J),复制并粘贴上面的代码,然后在浏览器窗口中移动鼠标。
评论
伊莫最好的答案
–这里
1月15日17:35
onmousemove = function(e){console.log(`鼠标位置= X:$ {e.x},Y:$ {e.y}`)}
– Zain
8月10日8:46
#4 楼
我相信我们对此有过多的思考, function mouse_position(e)
{
//do stuff
}
<body onmousemove="mouse_position(event)"></body>
评论
我是该论坛的新手,所以我知道,请解释为什么您-1nd我的遮阳篷-这是为了避免再次犯同样的错误。谢谢!程序员
– dGRAMOP
15年3月21日在15:12
我也很生气,没有任何解释。为了给您一个可能的解释,此答案并未解决OP每100 ms轮询一次的问题。在他对其他答案的回答中,很明显这是必要的。
–aaaaaa
15年4月16日在9:18
我认为也不推荐使用这种内联事件处理。 document.body.addEventListener(“ mousemove”,函数(e){})是执行此操作的方法,在您的JavaScript代码中而不是在html中
–瑞安
19年7月31日在21:49
#5 楼
我认为他只想知道光标的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);
* {
padding: 0:
margin: 0;
/*transition: 0.2s all ease;*/
}
#info {
position: absolute;
top: 10px;
right: 10px;
background-color: black;
color: white;
padding: 25px 50px;
}
<!DOCTYPE html>
<html>
<body>
<div id='info'></div>
</body>
</html>
#6 楼
基于ES6的代码:let handleMousemove = (event) => {
console.log(`mouse position: ${event.x}:${event.y}`);
};
document.addEventListener('mousemove', handleMousemove);
如果需要节流来移动鼠标,请使用以下代码:
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));
这里是例子
#7 楼
如果只想直观地跟踪鼠标的移动,则: <!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>
#8 楼
不论使用哪种浏览器,下面几行对我来说都是正确的,以获取正确的鼠标位置。event.clientX - event.currentTarget.getBoundingClientRect().left
event.clientY - event.currentTarget.getBoundingClientRect().top
#9 楼
我没有足够的声誉来发表评论,但我采用了TJ Crowder的出色回答,并在100ms计时器上完全定义了代码。 (他留下了一些想像的细节。)感谢OP提出的问题,感谢TJ的回答!你们俩都是很大的帮助。代码作为isbin的镜像嵌入在下面。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Example</title>
<style>
body {
height: 3000px;
}
.dot {
width: 2px;
height: 2px;
background-color: black;
position: absolute;
}
</style>
</head>
<body>
<script>
(function() {
"use strict";
var mousePos;
document.onmousemove = handleMouseMove;
setInterval(getMousePosition, 100); // setInterval repeats every X ms
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 );
}
mousePos = {
x: event.pageX,
y: event.pageY
};
}
function getMousePosition() {
var pos = mousePos;
if (!pos) {
// We haven't seen any movement yet, so don't add a duplicate dot
}
else {
// Use pos.x and pos.y
// Add a dot to follow the cursor
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>
#10 楼
只是@ T.J。的简化版本。 Crowder和@RegarBoy的答案。我认为更少。
请查看onmousemove事件以获取有关该事件的更多信息。 br />
每次鼠标根据水平和垂直坐标移动时,都有一个新值
posX
和posY
。<!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>
#11 楼
这是这两个要求的组合:每100毫秒跟踪一次鼠标位置: br />#12 楼
这是跟踪鼠标位置的最简单方法HTML
<body id="mouse-position" ></body>
document.querySelector('#mouse-position').addEventListener('mousemove', (e) => {
console.log("mouse move X: ", e.clientX);
console.log("mouse move X: ", e.screenX);
}, );
了解更多信息
#13 楼
最近,我们不得不找到当前的x,y位置以枚举光标悬停在其上的元素,而与z-index无关。我们最终只是将mousemove事件侦听器附加到文档,例如, function findElements(e) {
var els = document.elementsFromPoint(e.clientX, e.clientY);
// do cool stuff with els
console.log(els);
return;
}
document.addEventListener("mousemove", findElements);
评论
问题在于,第二次调用该函数时将没有事件对象。与使用setTimeout相比,您可能应该听一些事件。是的,但是mouse_position()函数不应该每隔100毫秒调用一次自己。它实际上不应该表现为无限递归函数吗?
Javascript中setInterval()上捕获鼠标位置的可能重复
@Titan:是的,但是我怀疑它将出错,因为window.event将是未定义的或为null。如果没有事件,则没有事件对象。
出于兴趣,这有什么用途?