2013-02-19 2 views
1

В Javascript возможно ли в обработчике события mousemove определить, есть ли ожидающие события mousemove в очереди?Javascript mousemove queue

Или, желательно, чтобы очередь событий пропускала все события mousemove в очереди, за исключением последней?

Я использую MouseMove & других события мыши, чтобы позволить пользователям перетаскивать элементы по экрану, и мне не нужно тратить ЦП & циклов GPU перерисовки перетаскиваемых элементов на каждом MouseMove события (в котором я обновляю верхнее & свойства CSS слева), если я могу пропустить промежуточные события достаточно быстро.

В настоящее время у меня нет проблем с производительностью или визуализацией; Я просто хочу сделать мой JavaScript максимально эффективным.

+0

Определение "перерисовать". Является ли это просто установкой свойств 'left' /' top', или это более активно? –

+0

Я думаю, что есть более интересные способы исправить вашу проблему, чем проверять очередь событий. Такой код действительно трудно понять. Легче просто установить таймер и только перерисовать, если, скажем, 1/10 секунды прошло. Увеличьте время, если вам нужно уменьшить нагрузку на оборудование, но они говорят, что люди могут обнаруживать события до 1/10 секунд друг от друга. Таким образом, перерисовка чаще всего делает то, что большинство людей даже не может обнаружить (хотя возможно, что мерцающий эффект кажется некоторым некоторым людям). –

+0

@CrescentFresh: Да, перерисовка - это просто 'left' /' top'. – XDR

ответ

1

Использовать событие debouncing. This small throttle/debounce library хорошо работает с 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); 
0

Вы можете следить за последнее время вы обработали MouseMove, затем пропустить текущую, если это слишком рано.

Например:

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 
}; 
Смежные вопросы