Проблема очень проста.
Сначала давайте настроим сценарий. У вас есть список сортируемых элементов, ваша страница выше экрана, поэтому у нее есть полоса прокрутки, ваша страница находится в самом низу, полоса прокрутки полностью вниз.
Проблема, вы идете, чтобы перетащить элемент, который заставляет jQuery удалить его из DOM, а затем добавить в качестве заполнителя. Давайте замедлим его, сначала он удаляет элемент, теперь список короче, а страница короче, а полоса прокрутки короче. Затем он добавляет заполнитель, теперь страница длиннее, теперь полоса прокрутки длиннее (но окно не прокручивается вниз, поэтому полоса прокрутки прыгнула вверх).
Лучший способ противодействовать этому - убедиться, что сортируемый список имеет статическую высоту, поэтому удаление элемента не приводит к его сокращению. Один из способов сделать это будет
create:function(){
jQuery(this).height(jQuery(this).height());
}
Вышеуказанное будет вызвано при создании сортируемого списка, статически устанавливающего его высоту равной текущей высоте.
Если у вас есть изображения в одном из сортируемых элементов, приведенный выше код не будет работать, если вы предварительно не определите размеры в теге. Причина в том, что когда вызывается и устанавливается высота (), он вычисляется до заполнения изображения. Нет измерения, тогда изображение не имеет места. Как только изображение загрузится, оно займет место.
Вот способ обойти определение размеров. Просто изменяйте высоту списка каждый раз при обнаружении загружаемого изображения.
create:function(){
var list=this;
jQuery(list).find('img').load(function(){
jQuery(list).height(jQuery(list).height());
});
}
Финальная версия:
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;
var 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);
}
});
});