Как я могу изменить mousemove на setInterval, сохраняя при этом доступ к координатам мыши/элемента?

Я хотел бы изменить это на setInterval, но я не знаю, как это сделать, сохраняя доступ к e.pageX, e.pageY, elem и т.д. Как я могу изменить это на setInterval (или есть событие в jquery что делает то же самое, что и setInterval, но является событием)?

http://jsfiddle.net/f1Lzqxom/

$(function(){

$(document).on( "mousemove", MouseMove );

var cachedElems = $( '.tracker' );

function MouseMove(e){
 var pageX = e.pageX,
 pageY = e.pageY;

 $.each(cachedElems, function(i,elem){
 elem = $(elem);

 var elemX = pageX - elem.offset().left,
 elemY = pageY - elem.offset().top;

 $(elem).text(
 'page x: ' + pageX + '\n' +
 'page y: ' + pageY + '\n' +
 '\n' +
 'elem x: ' + elemX + '\n' +
 'elem y: ' + elemY + '\n'
 );

 });
}

});
1 ответ

Изменить...

function MouseMove(e){
 ...
}

... чтобы...

$(document).mousemove(function(e){
 window.mouseXPos = e.pageX;
 window.mouseYPos = e.pageY;
});

Вышеприведенный код присоединяет движения мыши к глобальным переменным, которые вы можете ссылаться внутри setTimeout.

setInterval(function() {
 var pageX = window.mouseXPos,
 pageY = window.mouseYPos;

 $.each(cachedElems, function(i,elem){
 elem = $(elem);

 var elemX = pageX - elem.offset().left,
 elemY = pageY - elem.offset().top;

 $(elem).text(
 'page x: ' + pageX + '\n' +
 'page y: ' + pageY + '\n' +
 '\n' +
 'elem x: ' + elemX + '\n' +
 'elem y: ' + elemY + '\n'
 );

 });
}, 1000);

... с незначительным изменением в объявлении переменных pageX и pageY для использования новых глобальных переменных.

ПРИМЕЧАНИЕ.

Предоставив ответ, который я сделал, я был бы осторожен в том, что на уровне документа, всегда работающем mousemove, даже если вы только проголосовали за позицию курсора. Это много обработки и может заглушить любой браузер, особенно медленнее, чем IE.

Проблема вроде этого почти наверняка поднимает вопрос о дизайнерском решении: если вам не нужно обрабатывать событие мыши для опроса для позиции курсора, вам действительно нужна позиция курсора? Есть ли лучший способ решить проблему, которую вы пытаетесь решить?

ОБНОВЛЕНИЕ:

Остановка заданного интервала может быть выполнена таким образом.

var intervalId = setInterval(function() {
 ...
}, 1000);

/* Later */
clearInterval(intervalId);

licensed under cc by-sa 3.0 with attribution.