JQuery сортируемый ('сериализация') - PullRequest
11 голосов
/ 25 декабря 2009

Можно ли получить сериализованный список элементов из UL в jquery, вызвав метод serialize напрямую вместо использования обратного вызова? Фрагмент кода:

var sortableLinks = $("#category_links_list_3");
var linkOrderData = $(sortableLinks).sortable('serialize');

category_links_list_3 - это идентификатор UL

Структура DOM:

<div class="hidden" id="inline_list_3">
    <ul class="category_links_list ui-sortable" id="category_links_list_3">
        <li class="link_title ui-state-default" id="category_link_8">Coconut Oil</li>
        <li class="link_title ui-state-default" id="category_link_9">Hempseed</li>
    </ul>
</div>

Спасибо ...

Ответы [ 6 ]

21 голосов
/ 25 декабря 2009

Я наконец получил ответ! Вам нужно сначала сделать сортировку UL перед вызовом метода serialize:

var sortableLinks = $("#category_links_list_3");
$(sortableLinks).sortable();
var linkOrderData = $(sortableLinks).sortable('serialize');

На этот раз linkOrderData содержит category_link [] = 8 & category_link [] = 9

18 голосов
/ 25 декабря 2009

Если serialize возвращает пустую строку, убедитесь, что атрибуты id содержат подчеркивание. Они должны иметь вид: "set_number". Например, список из 3 элементов с атрибутами id foo_1, foo_5, foo_2 будет сериализован в foo[]=1&foo[]=5&foo[]=2. Вы можете использовать подчеркивание, знак равенства или дефис для разделения набора и числа. Например, foo=1 или foo-1 или foo_1 все сериализуются в foo[]=1.

Выше приведен пример. что я использовал это. Вот почему я видел 2 вас.

http://jqueryui.com/demos/sortable/#method-serialize

Это поможет вам.

3 голосов
/ 25 декабря 2009

var formStr = $ ('# container'). Serialize ()

Добавлено: это будет работать для элементов формы. Вы также можете свернуть свой собственный сериализацию так:

function serializeList(container)
{
  var str = ''
  var n = 0
  var els = container.find('li')
  for (var i = 0; i < els.length; ++i) {
    var el = els[i]
    var p = el.id.lastIndexOf('_')
    if (p != -1) {
      if (str != '') str = str + '&'
      str = str + el.id.substring(0, p) + '[]=' + (n + 1)
      ++n
    }
  }
  return str
}

alert(serializeList($('#container')))
1 голос
/ 05 июня 2019

HTML

<div class="section">
    <div class="row">
        <div class="col s6 m6 l6" style="background-color:beige">
            <ul id="sortable1" class="connectedSortable" style="min-height:30px">
                <li class="ui-state-default" id="item_1" data-id="1">Item 1</li>
                <li class="ui-state-default" id="item_2" data-id="2">Item 2</li>
                <li class="ui-state-default" id="item_3" data-id="3">Item 3</li>
                <li class="ui-state-default" id="item_4" data-id="4">Item 4</li>
                <li class="ui-state-default" id="item_5" data-id="5">Item 5</li>
            </ul>
        </div>
        <div class="col s0 m1 l1">
            <div style="visibility:hidden">a</div>
        </div>
        <div class="col s5 m5 l5" style="background-color:aqua">
            <ul id="sortable2" class="connectedSortable justify-content-right" style="min-height:30px"></ul>
        </div>
    </div>
    <textarea id="json-output"></textarea>
</div>

JQuery

$(document).ready(function () {

            var updateOutput = function (e) {
                var list = e.length ? e : $(e.target),
                    output = list.data('output');

                if (window.JSON) {
                    output.val(window.JSON.stringify(list.sortable('serialize'))); //, null, 2));
                } else {
                    output.val('JSON browser support required for this demo.');
                }
            };

            $("#sortable1, #sortable2").sortable({
                connectWith: ".connectedSortable",
                update: function () {
                    updateOutput($('#sortable2').data('output', $('#json-output')));
                },
            }).disableSelection();

        });

Результат

"item[]=1&item[]=4&item[]=2"

Надеюсь, эта помощь!

1 голос
/ 17 февраля 2013

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

function serializeList(container)
{
  var str = ''
  var n = 0
  var els = container.find('tr')
  for (var i = 0; i < els.length; ++i) {
    var el = els[i]

    var p = el.id.lastIndexOf('_')
    **var getIdNumber = el.id.split("_");**

    if (p != -1) {
      if (str != '') str = str + '&'
      str = str + el.id.substring(0, p) + '[]=' + **getIdNumber[1]**
      ++n
    }
  }
  return str
}
0 голосов
/ 06 февраля 2015

Этот пост был очень полезным. Если вам нужна дополнительная помощь, вот как я ее получил (используя haml-rails). Использование функции toArray немного отличается. Если вы используете `serialize ', вам придется снова установить атрибут как' data-item =" data-item _ # {id} '.

Спасибо, Интернет, за то, что вы знаете так много программных решений.

:css
  #sortable { list-style-type: none; margin: 40 20; padding: 0; width: 500; }
  #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; }

:javascript
  $(function() {

    $( "#sortable" ).sortable({
      update: function( event, ui ) {
        var data = $("#sortable").sortable('toArray', {attribute: "data-item"});  
        // return ids in order after update
        //alert(JSON.stringify(data));
        $.ajax({
          type: "PATCH",
          async: true,
          url: "/calendar/update_order.json",
          data: JSON.stringify(data),
          dataType: 'json',
          contentType: 'application/json',
          error: function(data) { return false; },
          success: function(data) { return false; }
        });
      }
    });
    $( "#sortable" ).disableSelection();

  });

#sort_tickets
  %ul#sortable
    - @tickets.each do |ticket|
      %li.ui-state-default(data-item="#{ticket.id}")<
        %span.ui-icon.ui-icon-arrowthick-2-n-s<
        = ticket.customer
...