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>
369   7  

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

    Ничего не найдено.