JQuery сортируемый' изменить ' положение элемента события
есть ли способ получить текущую позицию помощник перетаскивается на новое место ?
$("#sortable").sortable({
start: function (event, ui) {
var currPos1 = ui.item.index();
},
change: function (event, ui) {
var currPos2 = ui.item.index();
}
});
Кажется, что currPos1 и currPos2 имеют одинаковое значение, когда происходит фактическое изменение !
то, что мне нужно достичь, - это выделить пользователю все позиции между "начальным элементом перетаскивания" и "в настоящее время замененным элементом". Как только пользователь выпускает обновление кнопки мыши, и только тогда я получаю новую позицию, но мне это нужно до выпуска мыши.
5 ответов:
обновлено: 26/08/2016 чтобы использовать последнюю версию jQuery и jQuery ui плюс bootstrap для его стиля.
$(function() { $('#sortable').sortable({ start: function(event, ui) { var start_pos = ui.item.index(); ui.item.data('start_pos', start_pos); }, change: function(event, ui) { var start_pos = ui.item.data('start_pos'); var index = ui.placeholder.index(); if (start_pos < index) { $('#sortable li:nth-child(' + index + ')').addClass('highlights'); } else { $('#sortable li:eq(' + (index + 1) + ')').addClass('highlights'); } }, update: function(event, ui) { $('#sortable li').removeClass('highlights'); } }); });
это работает для меня:
start: function(event, ui) { var start_pos = ui.item.index(); ui.item.data('start_pos', start_pos); }, update: function (event, ui) { var start_pos = ui.item.data('start_pos'); var end_pos = ui.item.index(); //$('#sortable li').removeClass('highlights'); }
использовать
update
,stop
иreceive
события, проверьте это здесьсобытие jQuery Sortable Update может вызываться только один раз?
Если кто-то заинтересован в сортируемом списке с изменяющимся индексом на listitem (1-й, 2-й, 3-й и т. д...:
http://jsfiddle.net/aph0c1rL/1/
$(".sortable").sortable( { handle: '.handle' , placeholder: 'sort-placeholder' , forcePlaceholderSize: true , start: function( e, ui ) { ui.item.data( 'start-pos', ui.item.index()+1 ); } , change: function( e, ui ) { var seq , startPos = ui.item.data( 'start-pos' ) , $index , correction ; // if startPos < placeholder pos, we go from top to bottom // else startPos > placeholder pos, we go from bottom to top and we need to correct the index with +1 // correction = startPos <= ui.placeholder.index() ? 0 : 1; ui.item.parent().find( 'li.prize').each( function( idx, el ) { var $this = $( el ) , $index = $this.index() ; // correction 0 means moving top to bottom, correction 1 means bottom to top // if ( ( $index+1 >= startPos && correction === 0) || ($index+1 <= startPos && correction === 1 ) ) { $index = $index + correction; $this.find( '.ordinal-position').text( $index + ordinalSuffix( $index ) ); } }); // handle dragged item separatelly seq = ui.item.parent().find( 'li.sort-placeholder').index() + correction; ui.item.find( '.ordinal-position' ).text( seq + ordinalSuffix( seq ) ); } ); // this function adds the correct ordinal suffix to the provide number function ordinalSuffix( number ) { var suffix = ''; if ( number / 10 % 10 === 1 ) { suffix = "th"; } else if ( number > 0 ) { switch( number % 10 ) { case 1: suffix = "st"; break; case 2: suffix = "nd"; break; case 3: suffix = "rd"; break; default: suffix = "th"; break; } } return suffix; }
ваша разметка может выглядеть так:
<ul class="sortable "> <li > <div> <span class="ordinal-position">1st</span> A header </div> <div> <span class="icon-button handle"><i class="fa fa-arrows"></i></span> </div> <div class="bpdy" > Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod </div> </li> <li > <div> <span class="ordinal-position">2nd</span> A header </div> <div> <span class="icon-button handle"><i class="fa fa-arrows"></i></span> </div> <div class="bpdy" > Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod </div> </li> etc.... </ul>
$( "#sortable" ).sortable({ change: function(event, ui) { var pos = ui.helper.index() < ui.placeholder.index() ? { start: ui.helper.index(), end: ui.placeholder.index() } : { start: ui.placeholder.index(), end: ui.helper.index() } $(this) .children().removeClass( 'highlight' ) .not( ui.helper ).slice( pos.start, pos.end ).addClass( 'highlight' ); }, stop: function(event, ui) { $(this).children().removeClass( 'highlight' ); } });
пример того, как это может быть сделано внутри события изменения без хранения произвольных данных в хранилище элементов. Так как элемент, где начинается перетаскивание
ui.helper
, и элемент текущей позицииui.placeholder
, мы можем взять элементы между этими двумя индексами и выделить их. Кроме того, мы можем использоватьthis
внутри обработчика, так как он ссылается на элемент, к которому прикреплен виджет. Пример работает с перетаскиванием в обоих направление.