2013-07-23 22 views
9

http://jsfiddle.net/MrkY9/MouseMove ripetendo ogni secondo

Il mio computer (e, finora, nessun altro computer tra i miei colleghi) espone un problema in Chrome, IE e Safari (ma non in Firefox). Il semplice codice mousemove, come il seguente (già in esecuzione sul violino in alto) cattura correttamente gli eventi mousemove, ma fino a quando il mouse si trova nel div, rileva un evento mousemove ogni secondo, anche se non mi muovo più il mouse .

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

Questo sembra essere un problema basato su browser, dal momento che non mostra su FireFox. (Né si verifica su Windows. Anche quando il contatore sta salendo, se lascio la mia tastiera e il mouse da solo, il mio screen saver alla fine entra in azione.) Prima di concludere non è un problema di sistema, ho provato a sostituire il mouse e passare il Porta USB in cui è inserita. Non sorprende che nessuna di queste soluzioni risolva il problema.

Non ho capito come testarlo in qualcosa di diverso da javascript in un browser.

Domande: Qualcuno l'ha già incontrato prima? C'è qualcosa che devo fare per prenderlo? Ho un codice molto meno banale di questo violino che si basa sul sapere quando il mouse è e non si muove.

+1

Non riesco a riprodurre questo ... – Neal

+3

Potrebbe essere possibile aggirare il problema, salvando la posizione del mouse e controllando se la posizione è effettivamente diversa prima di fare tutto ciò che deve essere fatto. – sabof

+0

Nessun repository ......... –

risposta

16

Ok, ho trovato il problema, anche se non capisco perfettamente perché si è trattato di un problema.

Avevo Task Manager in esecuzione in background. E per qualche ragione, ogni volta che si aggiornava, stava causando a IE, Safari e Chrome di ricevere un evento Mousemove.

Non ha senso, ma almeno la correzione è semplice: chiudere il Task Manager.

(è molto evidente se ci si trova nella scheda Applicazioni. Se siete in Performance, dipende da quali sono i valori sono impostati.)

+2

Aveva lo stesso problema. Per me è stato perché avevo Flux in esecuzione e al momento stava cambiando i colori dello schermo del monitor. – Dwayne

+4

wtf, questo è esattamente quello che succede se hai un taskmanager aperto - grazie, mi hai risparmiato un sacco di tempo (e aumentando i capelli grigi)! – KIC

+3

@KIC Sono contento che il mio sacco di tempo e i capelli grigi potrebbero farti risparmiare un po '. :-) –

4

Per me il problema si verifica a volte quando iTunes è in riproduzione. So che iTunes (per Windows) ha avuto un problema di concentrazione per anni - tende a rubare l'attenzione dalle sue finestre popup.

Hai indicato il problema nella tua risposta (accettata): altre applicazioni possono rubare l'attenzione del browser, attivando l'evento mousemove a piacere. Tuttavia, per un sito web dal vivo non possiamo supporre che un utente non stia eseguendo alcuni programmi come Task Manager o iTunes.

Come suggerito nella sezione commenti della domanda, si prega di salvare la posizione del mouse e continuare a controllare se è cambiato.

codice di esempio utilizzando 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. 
}); 

(Nota:. È meglio utilizzare l'evento touchmove con le touches e changedTouches array di gesti tattili)

Spero che questo aiuti chiunque sbattere contro simili i problemi.

Edit: funzionalità aggiuntive agli eventi del mouse separati da eventi touch basati su commento di Scott di seguito:

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

Grazie per le tue informazioni aggiuntive.Giusto per chiarire la circostanza che ho avuto - volevamo solo fare in modo che una parte del nostro codice si occupasse degli eventi mouse/touch, così abbiamo avuto qualcosa che catturava gli eventi touch e li inoltrava come evento del mouse. Dal momento che un clic del mouse simulato fa scattare una mossa e un evento falso, abbiamo dovuto consentire agli eventi di muovere con movimento 0. –

+0

Ha senso. Probabilmente avrei provato a lavorarci intorno, ad esempio ascoltando sia "mousemove" che "touchmove" e separandoli tramite "e.type" all'interno del listener di eventi (vedi il mio post modificato sopra). Dal momento che entrambi i comandi 'mousedown' e' mousemove' allo stesso tempo un'altra soluzione potrebbe essere quella di aggiungere un listener di eventi per 'mousedown', registrare le coordinate di partenza e ignorare l'iniziale' mousemove'. Ad ogni modo, hai già risolto il problema, quindi queste sono solo alcune idee per la prossima volta che incontri problemi con il mouse. – Robbert

+0

Grazie per l'aggiunta. Ci sono sicuramente dei modi per aggirare il problema (anche se ciò avrebbe richiesto la modifica del codice in molti punti solo per gestire un caso estremamente marginale), ma l'accordo più importante per noi era trovare la causa principale. Finché conosciamo la causa principale, siamo perfettamente felici di dire al cliente di smettere di usare Task Manager - o iTunes. :-) –

0

Ho affrontato lo stesso problema esatto. Per Pure Javascript, ho sostituito onmousemove con onmouseover. Per jQuery, ho sostituito Mousemove con il mouseover. La soluzione più veloce per me.

+0

È fantastico, se non hai bisogno dell'evento mousemove. Sfortunatamente, avevo bisogno del mousemove, quindi il mouseover non mi ha aiutato. –