2012-11-05 20 views
5

Sto provando a fare un semplice script di trascinamento. L'idea è di salvare la posizione quando il mouse è inattivo, aggiornare la vista mentre il mouse è in movimento e fermarsi quando il mouse è in alto. Problema, l'evento mouseup non funziona correttamente.Mouseup non funziona dopo mousemove su img

vedere il codice:

var target = $('a') 
var pos = 0; 
var dragging = false; 

$(document).mousedown(function(e) { pos=e.pageX; dragging = true }) 
$(document).mouseup(function() { dragging = false }) 
$(document).mousemove(function(e) { 
    if(dragging){ 
     target.css('left', e.pageX-pos); 
    } 
}) ​ 

Perché mouseup funziona con una "a" tag: http://jsfiddle.net/leyou/c3TrG/1/

E perché mouseup non funziona con un tag "img": http://jsfiddle.net/leyou/eNwzv/

Basta provare a trascinarli orizzontalmente.

Same probleme su ie9, ff e chrome. Windows7

+0

Lavorando allo stesso modo per me, testato su chrome e firefox –

risposta

16

Basta aggiungere e.preventDefault() al gestore MouseDown, in questo modo:

var target = $('img') 
var pos = 0; 
var dragging = false; 

$(document).mousedown(function(e) { e.preventDefault(); pos=e.pageX; dragging = true }) 
$(document).mouseup(function() { dragging = false }) 
$(document).mousemove(function(e) { 
    if(dragging){ 
     target.css('left', e.pageX-pos); 
    } 
}) 

vedere Operazioni demo.

Il razionale è che il browser stava anche eseguendo il trascinamento della propria immagine nativa (come trascinare un'immagine e rilasciarla in un'applicazione esterna al browser), quindi è necessario annullare tale trascinamento predefinito con .preventDefault().

+1

Infatti, grazie. – leyou

+0

Puoi spiegare perché non dobbiamo usare 'preventDefault' nell'evento' mousemove'? Il problema del trascinamento viene visualizzato mentre l'immagine viene trascinata. – user31782

Problemi correlati