2013-07-23 3 views
9

http://jsfiddle.net/MrkY9/MouseMove событие повторяя каждый второй

Мой компьютер (и до сих пор, ни один другой компьютер среди моих коллег) не проявляет проблему в Chrome, IE и Safari (но не в Firefox). Простой код mousemove, такой как следующий (уже запущенный на скрипке выше), правильно улавливает mousemove событий, но до тех пор, пока мышь находится в div, каждый раз ловит событие mousemove - хотя я больше не двигаю мышью ,

var number = 0; 
$("#foo").on("mousemove", function() { this.innerHTML = number++ }); 

Это, кажется, проблема на основе браузера, поскольку она не отображается на FireFox. (И это происходит не в самой Windows. Даже когда счетчик растет, если я оставляю клавиатуру и мышь в одиночку, моя экранная заставка в конце концов срабатывает.) Прежде чем завершить это, это не проблема системы, я попытался заменить мышь и переключить USB-порт, в который он подключен. Неудивительно, что ни одно из этих решений не разрешает проблему.

Я не понял, как проверить это в чем-либо, кроме javascript, в браузере.

Вопросы: С кем это сталкивалось раньше? Есть ли что-нибудь, что мне нужно сделать, чтобы поймать его? У меня код гораздо менее тривиальный, чем этот скрипт, который полагается на знание, когда мышь и не движется.

+1

Я не могу воспроизвести это ... – Neal

+3

Возможно, обойти проблему можно, сохранив положение мыши и проверив, действительно ли позиция отличается от того, что необходимо сделать. – sabof

+0

Нет репо ......... –

ответ

16

Хорошо, я нашел проблему, хотя я не совсем понимаю, почему это была проблема.

У меня был диспетчер задач, работающий в фоновом режиме. И по какой-то причине, каждый раз, когда он обновлялся, он заставлял IE, Safari и Chrome получать событие mousemove.

Это не имеет смысла, но по крайней мере исправление прост: закройте диспетчер задач.

(Это очень очевидно, если вы находитесь в закладке Приложения. Если вы в производительности, это зависит от того, какие значения установлены в.)

+2

Была та же проблема. Для меня это было потому, что у меня был Flux, и в настоящее время он меняет цвета экрана монитора. – Dwayne

+4

wtf, это именно то, что происходит, если у вас есть открытый диспетчер задач - спасибо, вы спасли меня много времени (и увеличивали седые волосы)! – KIC

+3

@KIC Рад, что много времени и седые волосы могут спасти вас. :-) –

4

Для меня проблема случается иногда, когда ITunes играет. Я знаю, что iTunes (для Windows) сталкивается с целенаправленной проблемой в течение многих веков - она ​​стремится украсть фокус из своих всплывающих окон.

Вы указали на проблему в своем (принятом) ответе: другие приложения могут украсть фокус браузера, уволив событие mousemove по желанию. Однако для живого веб-сайта мы не можем предположить, что пользователь не запускает определенные программы, такие как диспетчер задач или iTunes.

Как было предложено в разделе комментариев вопроса, сохраните позицию мыши и продолжайте проверять, не изменилось ли оно.

Пример код с помощью JQuery:

var old_pos = [0, 0]; 
$(el).on("mousemove", function(e) { 
    var new_pos = [e.clientX, e.clientY]; 

    // Quit if the mouse position did not change. 
    if(old_pos[0] == new_pos[0] && old_pos[1] == new_pos[1]) 
     return; 

    // Your code. 
}); 

(Примечание:. Вы лучше использовать touchmove событие с touches и changedTouches массивами для сенсорных жестов)

Надеется, что это помогает кто-то натыкаясь на аналогичный проблемы.

Edit: дополнительные функциональные возможности для отдельных событий мыши от сенсорных событий, основанных на комментарий Скотта ниже:

var old_pos = [0, 0]; 
$(el).on("mousemove touchmove", function(e) { 
    var new_pos = [e.clientX, e.clientY]; 

    // Quit if the mouse position did not change. 
    if(e.type == "mousemove" && old_pos[0] == new_pos[0] && old_pos[1] == new_pos[1]) 
     return; 

    // Your code. 
}); 
+0

Спасибо за дополнительную информацию.Чтобы уточнить обстоятельства, которые у меня были, мы хотели сделать только одну часть нашего кода с событиями мыши/касания, так что что-то поймало события касания и перенаправляло их как событие мыши. Так как имитируемый щелчок мыши вызывает движение и событие mousedown, нам нужно было разрешить перемещение событий с 0 перемещением. –

+0

Делает смысл. Вероятно, я бы попытался обойти это, например, прослушивая «mousemove» и «touchmove» и разделяя их через «e.type» внутри прослушивателя событий (см. Мой отредактированный пост выше). Поскольку оба режима «mousedown» и «mousemove» в то же время могут быть добавлены слушателем событий для «mousedown», записывайте начальные координаты и игнорируйте начальную «mousemove». В любом случае, вы уже решили проблему, так что это всего лишь некоторые идеи для следующего раза, когда вы сталкиваетесь с проблемой событий мыши. – Robbert

+0

Спасибо за добавление. Есть определенно способы обойти эту проблему (хотя это потребовало бы изменения кода во многих местах, чтобы справиться с крайним случаем), но для нас большая проблема заключалась в поиске основной причины. До тех пор, пока мы знаем основную причину, мы совершенно счастливы сообщить клиенту прекратить использование диспетчера задач - или iTunes. :-) –

0

Я столкнулся с точно таким же вопросом. Для чистого Javascript я заменил onmousemove на onmouseover. Для jQuery я заменил mousemove на мыши. Самое быстрое исправление для меня.

+0

Это здорово, если вам не нужно событие mousemove. К сожалению, мне нужна была mousemove, поэтому мышь не помогла. –

Смежные вопросы