【问题标题】:How to serialize a nested sortable ul list如何序列化嵌套的可排序 ul 列表
【发布时间】:2019-01-14 16:37:25
【问题描述】:

基于这个例子,我尝试序列化列表,但是jquery-ui的内置函数似乎只支持一个级别。

是否也可以捕捉其他元素?

   <ul class="sortable">
      <li id="link-1">Foo!
        <ul class="sortable">
          <li id="link-2">FooFoo!
            <ul class="sortable"></ul>
          </li>
          <li id="link-3">FooBar!
            <ul class="sortable"></ul>
          </li>
          <li id="link-4">FooBaz!
            <ul class="sortable"></ul>
          </li>
        </ul>
      </li>
      <li id="link-6">Bar!
        <ul class="sortable"></ul>
      </li>
      <li id="link-7">Baz!
        <ul class="sortable"></ul>
      </li>

javascript:

$(function () {
      $('ul.sortable').sortable({
        connectWith: 'ul.sortable',
        placeholder: 'placeholder',
        update: function (event, ui) {
            var result = $(".sortable").sortable().sortable("serialize");
            alert("result: "+result);
      }).disableSelection();
});

Codepen:https://codepen.io/KenPowers/pen/zxIcB

【问题讨论】:

  • 欢迎来到 Stack Overflow。我想你在这里有点多余:$(".sortable").sortable().sortable("serialize");
  • 对不起,我看不出区别!?最重要的是,与此同时,我认为我无法以这种方式工作,无法使用此 ID 重置顺序,我认为必须更改子文件夹的 ID!?
  • 您的代码中也存在一些语法错误,您缺少一些右括号和结束标记。可排序按预期工作,它为您提供该特定列表的序列化。您必须构建一个自定义函数来将整个列表和子列表序列化在一起。

标签: jquery jquery-ui


【解决方案1】:

考虑以下代码。

$(function() {
  $('.sortable').sortable({
    connectWith: '.sortable',
    placeholder: 'placeholder',
    update: function(event, ui) {
      var struct = [];
      var i = 0;
      $(".sortable").each(function(ind, el) {
        struct[ind] = {
          index: i,
          class: $(el).attr("class"),
          count: $(el).children().length,
          parent: $(el).parent().is("li") ? $(el).parent().attr("id") : "",
          parentIndex: $(el).parent().is("li") ? $(el).parent().index() : "",
          array: $(el).sortable("toArray"),
          serial: $(el).sortable("serialize")
        };
        i++;
      });
      console.log("Structure", struct);
      var iArr = [];
      var iSer = [];
      $(".sortable:eq(0) li").each(function(ind, el) {
        var label = $(el).attr("id");
        iArr.push(label);
        var pre = label.slice(0, label.indexOf("-")) + "[]=";
        iSer.push(pre + label.slice(label.indexOf("-") + 1));
        if ($(el).children().eq(0).is("ul")) {
          $(el).find("li").each(function() {
            iArr.push($(this).attr("id"));
            iSer.push(pre + $(this).attr("id").slice(label.indexOf("-") + 1));
          });
        }
      });
      console.log("Items Array", iArr);
      console.log("Items Serial", iSer.join("&"));
    }
  }).disableSelection();
});
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<ul class="sortable">
  <li id="link-1">Foo!
    <ul class="sortable">
      <li id="link-2">FooFoo!
        <ul class="sortable"></ul>
      </li>
      <li id="link-3">FooBar!
        <ul class="sortable"></ul>
      </li>
      <li id="link-4">FooBaz!
        <ul class="sortable"></ul>
      </li>
    </ul>
  </li>
  <li id="link-6">Bar!
    <ul class="sortable"></ul>
  </li>
  <li id="link-7">Baz!
    <ul class="sortable"></ul>
  </li>
</ul>

这将遍历每个&lt;li&gt; 元素并构建一个数组和序列化结果。它将查找单个子元素,如果存在,则将这些项与其余项放在一起,就好像所有项都在一个列表中一样。

希望对您有所帮助。

【讨论】:

  • 太棒了,它帮助很大,让很多想法更容易理解。如果我将其保存在数据库中,如何使用生成的“结构”恢复树?是否有一种可排序的“恢复功能”?
  • @caro 这些问题似乎超出了您的帖子。请为您的帖子提供更多详细信息,并附上示例,并可以更新我的答案。
  • 如果我将帖子更改为当前情况,没有人可以看到我的第一篇帖子以了解我的问题/问题 - 还是我误会了您?根据您的代码,我想做一个 ajax 调用以将结构保存在 db 中(我可能需要序列化它们吗?)。如果它完成了,我需要一个函数来重置树,如果页面会刷新。
  • 如果我的帖子回答了您的问题,请标记它。如果您有其他情况,可以发布另一个带有适当示例和详细信息的问题。
  • 好的,我明白了 :-) 我创建了一个新问题,你能看看吗? stackoverflow.com/questions/54193761/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多