Il problema è molto semplice.
Per prima cosa impostiamo lo scenario. Hai una lista di elementi ordinabili, la tua pagina è più in alto del tuo schermo quindi ha una barra di scorrimento, la tua pagina è in fondo, la barra di scorrimento fino in fondo.
Il problema, si va a trascinare un elemento che causa jQuery per rimuoverlo dalla dom, quindi aggiungere un segnaposto. Rallentiamolo, rimuove prima l'elemento, ora l'elenco è più breve e la pagina si accorcia, causando una riduzione della barra di scorrimento. Quindi aggiunge il segnaposto, ora la pagina è più lunga, ora la barra di registrazione è più lunga (ma la finestra non scorre indietro, quindi sembra che la barra di scorrimento sia saltata in alto).
Il modo migliore che ho trovato per contrastare questo sarebbe garantire che l'elenco ordinabile abbia un'altezza statica, quindi la rimozione di un elemento non lo fa andare più corto. Un metodo per fare questo sarebbe
create:function(){
jQuery(this).height(jQuery(this).height());
}
È possibile che questo sarà chiamato al momento della creazione della lista ordinabile, staticly impostando la sua altezza alla sua altezza attuale.
Se si dispone di immagini in uno degli elementi ordinabili, il codice sopra riportato non funzionerà se non si predefiniscono le dimensioni nel tag. Il motivo è che quando l'altezza() viene chiamata e impostata, sta calcolando prima che l'immagine venga riempita. Nessuna dimensione, quindi l'immagine non tiene conto dello spazio. Una volta caricata l'immagine, occuperà spazio.
Ecco un modo per definire le dimensioni. Ridimensiona semplicemente l'altezza della lista ogni volta che viene rilevata un'immagine da caricare.
create:function(){
var list=this;
jQuery(list).find('img').load(function(){
jQuery(list).height(jQuery(list).height());
});
}
Versione finale:
jQuery(document).ready(function(){
jQuery("div#todoList").sortable({
handle:'img.moveHandle',
opacity: 0.6,
cursor: 'move',
tolerance: 'pointer',
forcePlaceholderSize: true,
update:function(){
jQuery("body").css('cursor','progress');
var order = jQuery(this).sortable('serialize');
jQuery.post("/ajax.php?do=sort&"+order,function(data){jQuery("body").css('cursor','default');});
},
create:function(){
var list=this;
resize=function(){
jQuery(list).css("height","auto");
jQuery(list).height(jQuery(list).height());
};
jQuery(list).height(jQuery(list).height());
jQuery(list).find('img').load(resize).error(resize);
}
});
});
Sono in FF 3.6 e non vedo alcun problema reale. Se afferro quello in basso e lo trascino verso l'alto, la scatola non scorre finché non raggiunge la cima. – Bialecki
Prova [questa soluzione] (http://stackoverflow.com/a/14361849/5444623) prima di scherzare con javascript – PeterM