Получить порядок элементов списка в сортируемом списке jQuery после курорта - PullRequest
27 голосов
/ 16 марта 2011

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

http://jqueryui.com/demos/sortable/

Хитрость заключается в том, что я хотел бы сразу же захватить порядок элементовпосле обработки и назначьте значения порядка скрытым элементам формы, которые будут переданы на мой сервер через форму отправки, где я мог бы использовать скрипт php для сохранения нового порядка элементов в базе данных.

ВотИсходный код демонстрации:

 <style>
    #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
    #sortable li { margin: 0 3px 3px 3px; padding: 0.4em; padding-left: 1.5em; font-size: 1.4em; height: 18px; }
    #sortable li span { position: absolute; margin-left: -1.3em; }
    </style>
    <script>
    $(function() {
        $( "#sortable" ).sortable();
        $( "#sortable" ).disableSelection();
    });
    </script>


<div class="demo">

<ul id="sortable">
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li>
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li>
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li>
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4</li>
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5</li>
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6</li>
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7</li>
</ul>

</div><!-- End demo -->

И я знаю, что также можно назначить функцию обратного вызова, которая срабатывает при остановке сортировки:

$( ".selector" ).sortable({
   stop: function(event, ui) { ... }
});

Спасибо!

Ответы [ 7 ]

37 голосов
/ 16 марта 2011

Я написал ответ на этот вопрос 5 лет назад, но этот ответ отстой (и этот вопрос имеет почти 38 000 просмотров), поэтому вот улучшенный ответ.

По существу, три частиэтого вопроса, который вы должны решить.Мы рассмотрим все три.

Реакция на изменения в порядке сортировки (Шаг 1)

Первая проблема, которую нам нужно решить, это реакция на изменения в порядке отсортированных элементов.Если мы посмотрим документацию jQuery UI Sortable Widget , мы увидим, что у нее есть событие change, которое вызывается при изменении порядка сортировки и идеально подходит для наших нужд.

Примечание: в моем исходном ответе вместо события change использовался stop.change лучше (по крайней мере, в этом случае), поскольку он будет сообщать обо всех изменениях в сортировке, независимо от того, было ли изменение интерактивным (пользовательским) или программным, и только в том случае, если порядок действительно изменился.С другой стороны, событие sort вызывается только тогда, когда пользователь прекращает сортировку (отпускает мышь или поднимает палец).

Используя событие sort, мы теперь можем ответить наизменения в сортировке.Следующий код инициализирует для нас виджет Sortable и позволит нам установить функцию, которая будет вызываться при срабатывании sort:

var $sortableList = $("#your-list");

var sortEventHandler = function(event, ui){
    console.log("New sort order!");
};

$sortableList.sortable({
    stop: sortEventHandler
});

// You can also set the event handler on an already existing Sortable widget this way:

$sortableList.on("sortchange", sortEventHandler);

. После этого мы готовы приступить к работе.на шаге 2:

Извлечение отсортированных элементов (Шаг 2)

Эта часть довольно проста.Нам просто нужно получить массив элементов в нашем отсортированном списке.Для этого мы можем просто запросить дочерние элементы элемента ul (список), используя функцию jQuery children():

var listElements = $sortableList.children();

console.log(listElements); // [ <li>, <li>, ... ]

Отлично, но нам конкретно нужны значения элемента:

var listValues = [];

listElement.forEach(function(element){
    listValues.push(element.innerHTML);
});

console.log(listValues); // [ "Item 1", "Item 2", ... ]

Также можно использовать .sortable("toArray") или .serialize().

Отлично!К последнему биту.

Сериализация и отправка нового отсортированного заказа (Шаг 3)

Сериализация - это «процесс преобразования структур данных или состояния объекта в формат, который можно сохранить (например, в файле или в буфере памяти, или передаваться по ссылке сетевого подключения) "(спасибо Википедия !)

То, как вы это сделаете, во многом зависит от ваших конкретных потребностей, поэтому мыЯ просто расскажу о некоторых способах, которыми вы могли бы сделать это с помощью jQuery.

AJAX:

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

$.post("your-server.com/save_order", { "items": listValues } );

Или, если вы предпочитаете JSON:

$.post("your-server.com/save_order", JSON.encode({ "items": listValues }) );

Форма

СоздатьФорма:

<form action="your-server.com/save_order" method="POST">
    <input name="items" value="" />
</form>

Обновление ввода item:

var serializedValue = $.param(listValues);

$("#ourForm > input").val(JSON.encode(listValues));

Отправка:

$("#ourForm").submit()

Старый ответ:

HTML:

<form action="save_order.php" method="POST" style="display: none;">
<input name="new_order" value="" type="hidden" />
</form>

JavaScript:

$(".selector").sortable({
    stop: function(event, ui) {
        var data = "";

        $("#sortable li").each(function(i, el){
            var p = $(el).text().toLowerCase().replace(" ", "_");
            data += p+"="+$(el).index()+",";
        });

        $("form > [name='new_order']").val(data.slice(0, -1));
        $("form").submit();
    }
});

А в файле save_order.php вы можете проанализировать POST-переменную "new_order" и получить заказы из элементов 1, 2, 3 и т. Д..

11 голосов
/ 16 марта 2011

Попробуйте использовать serialize для форматирования строки для отправки в ваш скрипт обновления базы данных.

http://jsfiddle.net/zFQ2j/

http://docs.jquery.com/UI/Sortable#method-serialize

8 голосов
/ 08 октября 2013

Может это поможет:

alert($( "#sortable" ).sortable( "toArray" ).toSource());
4 голосов
/ 02 мая 2018

май, 2018

В этом примере Javascript каждый раз при сортировке будет показан весь список DIVS в #sortableContainer

<div id="sortableContainer">
   <div id="Element1" class="sortIt">Item 1</div>
   <div id="Element2" class="sortIt">Item 2</div>
   <div id="Element3" class="sortIt">Item 3</div>
   <div id="Element4" class="sortIt">Item 4</div>
</div>

JS:

$( function() {
  $( "#sortableContainer" ).sortable({

    stop: function(event, ui) {

      var itemOrder = $('#sortableContainer').sortable("toArray");

      for (var i = 0; i < itemOrder.length; i++) {
        console.log("Position: " + i + " ID: " + itemOrder[i]);
      }

    }
  });

});

ДЕМО и Кредиты: http://www.tutorialspark.com/jqueryUI/jQuery_UI_Sortable_Getting_Order_of_Sortable.php

0 голосов
/ 20 мая 2019

Вот как я это сделал. Использовал обработчик событий, чтобы перехватить событие сортировки, а затем получить отсортированные значения через функцию ToArray, перебрать значения и присвоить массиву.Этот массив потом можно передать в Ajax post

    var $sortableList = $("#sortable");

var sortEventHandler = function(event, ui){
    var sortedIDs = $( "#sortable" ).sortable( "toArray" );
                var listValues = [];
                for (var i = 0; i < sortedIDs.length; i++) {

                listValues.push(sortedIDs[i]);
      }
            console.log(listValues);
};

$sortableList.sortable({
    stop: sortEventHandler
});

$sortableList.on("sortchange", sortEventHandler);
0 голосов
/ 13 ноября 2018

И вы можете:

jQuery_2( function() {
 var url = '<?php echo base_url(); ?>planner/Planner/edit_status/';
 jQuery_2('ul[id^="sort"]').sortable({
     connectWith: ".sortable",
     /*receive: function (e, ui) {
         var status_id = jQuery_2(ui.item).parent(".sortable").data("status-id");
         var task_id = jQuery_2(ui.item).data("task-id");
         jQuery_2.ajax({
             url: url,
             method: 'POST',
             data: { status_id: status_id, task_id: task_id, },
             success: function(response){ }
         });
    },*/
    update: function(e, ui) {
        var status_id = jQuery_2(ui.item).parent(".sortable").data("status-id");
        var task_id = jQuery_2(ui.item).data("task-id");
        //var order_id = jQuery_2(ui.item).index();
        var order_id = [];

        $("#sort"+status_id+" li").each(function(index) {
            order_id.push($(this).attr('data-task-id'));
        });

        jQuery_2.ajax({
            url: url,
            method: 'POST',
            data: { status_id: status_id, task_id: task_id, order_id: order_id, },
            success: function(response){ }
        });
    }

 }).disableSelection();
 } );
0 голосов
/ 12 ноября 2018

Легко решить:

jQuery_2( function() {
 var url = '<?php echo base_url(); ?>planner/Planner/edit_status/';
 jQuery_2('ul[id^="sort"]').sortable({
     connectWith: ".sortable",
     /*receive: function (e, ui) {
         var status_id = jQuery_2(ui.item).parent(".sortable").data("status-id");
         var task_id = jQuery_2(ui.item).data("task-id");
         jQuery_2.ajax({
             url: url,
             method: 'POST',
             data: { status_id: status_id, task_id: task_id, },
             success: function(response){ }
         });
    },*/
    update: function(e, ui) {
        var status_id = jQuery_2(ui.item).parent(".sortable").data("status-id");
        var task_id = jQuery_2(ui.item).data("task-id");
        var order_id = jQuery_2(ui.item).index();
        jQuery_2.ajax({
            url: url,
            method: 'POST',
            data: { status_id: status_id, task_id: task_id, order_id: order_id, },
            success: function(response){ }
        });
    }

 }).disableSelection();
 } );

var order_id = jQuery_2 (ui.item) .index (); // Получить заказ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...