Javascript mousemove очередь событий
В Javascript возможно ли в обработчике mousemove определить, есть ли какие-либо ожидающие события mousemove в очереди?
Или, желательно, можно ли заставить очередь событий пропускать все события перемещения мыши в очереди, кроме самого последнего?
Я использую mousemove и другие события мыши, чтобы позволить пользователям перетаскивать элементы по экрану, и мне не нужно тратить циклы CPU и GPU, перерисовывая перетаскиваемые элементы в каждом событии mousemove (в котором я обновляю свойства CSS в верхней и левой частях экрана)), пока я могу пропустить промежуточные события достаточно быстро.
Мой сайт в настоящее время не испытывает проблем с производительностью или визуализацией; Я просто хочу сделать мой JavaScript максимально эффективным.
2 ответа
Используйте событие debouncing. Эта небольшая библиотека throttle/debounce хорошо работает с jQuery или без него.
Пример:
function someCallback() {
// snip
}
// don't fire more than 10 times per second
var debouncedCallback = Cowboy.debounce(100, someCallback);
document.getElementById('some-id').addEventListener('mousemove', debouncedCallback);
Вы можете отслеживать последний раз, когда вы обрабатывали движение мыши, а затем пропустить текущее, если это слишком рано.
Например:
elem.onmousemove = function() {
var lastcalled = arguments.callee.lastCallTime || 0,
now = new Date().getTime();
if( now-lastcalled < 250) return;
arguments.callee.lastCallTime = now;
// rest of code here
};