今回は、複数のソート済みリストがあって、その要素をドラッグ&ドロップで別のリストに移せて、移したらそのリスト内でソートをしたい。
まずは、要素をドラッグ&ドロップで別のリストに移す。
これは、sortableのconnectWithで指定してやることでできる。
Ishida
Uchida
Yamada
Arclight
Blade
Eve
<div class="sortable" style="border:1px solid; padding:5px; margin: 5px; width: 100px;">
<div>Ishida</div>
<div>Uchida</div>
<div>Yamada</div>
</div>
<div class="sortable" style="border:1px solid; padding:5px; margin: 5px; width: 100px;">
<div>Arclight</div>
<div>Blade </div>
<div>Eve</div>
</div>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('.sortable').sortable({
connectWith:'.sortable'
});
});
</script>
次に移したリスト内でソート。
移した先でのeventはreceive。なので、ここにリスト内でソートさせればOK!!
と、思ったけど、リスト内で位置変えた場合に、ソートがされないので、順番が崩れる。
なので、リスト内のソートはupdateイベントに処理を書く。省略するけど、ajaxでDB側に更新投げる処理は、receiveに書く。
Ishida
Uchida
Yamada
Arclight
Blade
Eve
<script type="text/javascript">
$(document).ready(function(){
$('.sortable').sortable({
connectWith:'.sortable',
update: function(event, ui) {
var item = ui.item.parent();
var funcSort = function(a, b) {
var compA = $(a).text();
var compB = $(b).text();
return (compA < compB) ? -1 : (compA > compB) ? 1 : 0;
};
var listItems = item.children('div').get();
listItems.sort(funcSort);
$.each(listItems, function(i, itm) { item.append(itm); });
}
});
});
</script>
これでやりたいことはできた。リスト内のソートはtextでやったけど、classにソートに使う値を持たせるなどやりようはある。
jQueryとか使うとUIリッチになってサービスの使い勝手あげられるのでGood!!