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>
7 ответов:
положение мыши сообщается на
eventобъект, полученный обработчиком дляmousemoveсобытие, которое вы можете прикрепить к окну (событие пузыри):(function() { document.onmousemove = handleMouseMove; 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 ); } // 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 МС (10 раз/сек), попробуйте сохранить фактическую обработку, которую вы делаете в этой функции очень, очень ограниченный. Это много работы для браузера, в частности более старые Microsoft. Да, на современных компьютерах это не кажется много, но есть много происходит в браузерах... Так, например, вы можете отслеживать последнюю позицию, которую вы обработали, и сразу же освобождать от обработчика, если позиция не изменилась.
вот решение, основанное на jQuery и прослушивателе событий мыши (что намного лучше, чем обычный опрос) на теле:
$("body").mousemove(function(e) { document.Form1.posx.value = e.pageX; document.Form1.posy.value = e.pageY; })
onmousemove = function(e){console.log("mouse location:", e.clientX, e.clientY)}Откройте консоль (Ctrl + Shift+J), скопируйте-вставьте код выше и наведите курсор мыши на окно браузера.
Я считаю, что мы слишком много думаем об этом,
function mouse_position(e) { //do stuff }<body onmousemove="mouse_position(event)"></body>
что я думаю, что он хочет знать только позиции 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>
независимо от браузера, ниже строки работали для меня, чтобы получить правильное положение мыши.
event.clientX - event.currentTarget.getBoundingClientRect().left event.clientY - event.currentTarget.getBoundingClientRect().top
код на основе 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));здесь пример
Comments