Получите массив идентификаторов после сортировки JQuery UI

Я использую jQuery UI draggable и sortable functions, и я новичок в этом. У меня есть список элементов слева (сгенерированный из базы данных), и у меня есть поля справа, где пользователь может перетаскивать их. В то время как/после удаления пользователь может их сортировать.

Вот полный предварительный просмотр: http://jsbin.com/oBeXiko/3

Проблема: как я могу получить массив идентификаторов элементов в каждом поле после сортировки?

Я попытался использовать .sortable( "toArray" ) и sortable ( "serialize" ), но оба возвращают пустую строку.

Простой HTML

<div id="raspored">  
      <div class="left">
        <ul id="kanta">Delete</ul>    
        <ul id="lista_predmeta" class="droptrue">
          <li class="predmet ui-state-default" predmet-id="id_1">Item_1</li>
          <li class="predmet ui-state-default" predmet-id="id_2">Item_2</li>
          <li class="predmet ui-state-default" predmet-id="id_3">Item_3</li>
          <li class="predmet ui-state-default" predmet-id="id_4">Item_4</li>
        </ul>
      </div>
      <div class="right">     
        <ul class="raspored" razred="1">I</ul>  
        <ul class="raspored" razred="2">II</ul>  
        <ul class="raspored" razred="3">III</ul>  
        <ul class="raspored" razred="4">IV</ul>  
      </div>  
  </div> 

Мои функции jQuery

$(document).ready(function() {
     var url = "";
     var raz = 0;

    $( ".raspored" ).sortable({
        cursor: 'move',
        opacity: 0.65,
        stop: function ( event, ui){
            var data = $(this).sortable('toArray');
            console.log(data); // This should print array of IDs, but returns empty string/array
       }
    });

    $(".raspored").droppable({
         accept: ".predmet",   
         drop: function(event, ui){
            ui.draggable.removeClass("predmet");
            ui.draggable.addClass("cas");
            raz = $(this).attr("razred");
         }
    });


    $(".predmet").draggable({
        connectToSortable:".raspored",
        helper: "clone",
        revert: "invalid",

        stop: function(event, ui){
                var predmet = $(this).attr("predmet-id") ;
                console.log( "PredmetID = " + predmet + " | RazredID = " + raz);
        }
    });

    $("#kanta").droppable({
        accept: ".cas",
        drop: function(event, ui){
            ui.draggable.remove();
        }
    });

    $( ".raspored, .predmet, .cas, #kanta, #lista_predmeta" ).disableSelection();
  });

Ответ 1

Когда вы вызываете toArray, вы можете передать объект опций с полем attribute. Это поле attribute определяет, какой атрибут используется в вызове toArray. Например:

var data = $(this).sortable('toArray', { attribute: 'predmet-id' });

Это даст вам массив атрибутов predmet-id элементов. См. Документацию toArray .

Обратите внимание, что значение по умолчанию attribute равно id, поэтому ваш массив возвращал пустые строки раньше - ни один из ваших элементов не имеет атрибутов id!

Ответ 2

используйте сериализацию, которая работает для меня. ниже приведен пример кода, который может вам помочь.

<ul id="sortable">
<li id="ID_11" class="ui-state-default">sai</li>
<li id="ID_21" class="ui-state-default">2</li>
<li id="ID_3" class="ui-state-default">3</li>
<li id="ID_4" class="ui-state-default">4</li>
<li id="ID_5" class="ui-state-default">5</li>
<li id="ID_6" class="ui-state-default">6</li>
<li id="ID_7" class="ui-state-default">7</li>
<li id="ID_8" class="ui-state-default">8</li>
<li id="ID_9" class="ui-state-default">9</li>
<li id="ID_10" class="ui-state-default">10</li>
<li id="ID_11" class="ui-state-default">11</li>
<li id="ID_12"  class="ui-state-default">12</li>
</ul>
 <a href="javascript:void(0);" onClick="saveDisplayChanges();">Save</a>
 <span id="categorysavemessage"></span>

Код Javascript:

<script>
   $(function() {
   $( "#sortable" ).sortable();
});

function saveDisplayChanges()
{
  var order =  $("ul#sortable").sortable("serialize");
  var a = "hello";
  var b = "hi";
  $.post("update_displayorder.php?"+order+"&a=hello"+"&b=developer",{abc:a,xyz:b},function(theResponse){
  $("#categorysavemessage").html(theResponse);

});
}
</script>

PHP скрипт для данных заказа выборки с другой информацией update_displayorder.php script:

<?php
echo "<pre>";
print_r($_REQUEST); 

$newOrder = $_POST['ID'];
$counter = 1;
foreach ($newOrder as $recordIDValue) {
   echo $counter .' '. $recordIDValue .'<br/>';
   $counter ++;
}
?>