javascript - 在动态创建的 UL 上使用 Sortable

标签 javascript jquery jquery-ui html-lists jquery-ui-sortable

对于经常使用 JQuery 的人来说,这可能是一个简单的问题。我只是将 S3 中的列表读入数组并使用

document.getElementById('my-list').appendChild(makeUL(options));

在 div 中构建一个 ul,id 为 my-list。它看起来像这样:

<div id="my-list">
    <ul id="sortable">
        <li class="ui-state-default">LivePD</li>
        <li class="ui-state-default">Football</li>
        <li class="ui-state-default">Walking Dead</li>
        <li class="ui-state-default">Survivor</li>
        <li class="ui-state-default">The Voice</li>
        <li class="ui-state-default">Shark Tank</li>
        <li class="ui-state-default">DWTS</li>
        <li class="ui-state-default">RHOOC</li>
    </ul>
</div>

我有如下排序功能:

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

问题来了。如果我将 ul 硬编码到我的 HTML 正文中,如上所示,可排序代码运行良好。它按预期将 ui-sortable 类添加到 ul 和 li 元素。如果我使用 getElementById 动态构建 ul,基本 HTML 呈现完全相同,但 sortable 不添加类。

这与 DOM 执行的顺序有关吗?我根本无法弄清楚,也无法在任何地方找到另一个例子。对其他想法也完全开放。

最佳答案

请检查:

jQuery UI API Sortable Refresh Method

它说:

Refresh the sortable items. Triggers the reloading of all sortable items, causing new items to be recognized.

动态添加元素时,您将在初始化 Sortable 之前或之后添加它们。如果之前完成,您只需组装列表项,然后调用 sortable。如果之后,添加项目,然后运行刷新方法。

这是一个有点复杂的示例,但它假定您从基于 API 的列表中添加项目,并且可能稍后添加更多项目。

$(function() {
  var extData = [{
    label: "LivePD",
    id: 1
  }, {
    label: "Football",
    id: 2
  }, {
    label: "Walking Dead",
    id: 3
  }, {
    label: "Survivor",
    id: 4
  }, {
    label: "The Voice",
    id: 5
  }, {
    label: "Shark Tank",
    id: 6
  }, {
    label: "DWTS",
    id: 7
  }, {
    label: "RHOOC",
    id: 8
  }];

  function updateList(data, target) {
    var sort = target.find(".sortable");
    console.log(data, sort);
    $.each(data, function(k, v) {
      $("<li>", {
        class: "ui-state-default",
        id: target.attr("id") + "-item-" + v.id
      }).html(v.label).appendTo(sort);
    });
    if (sort.hasClass("ui-sortable")) {
      sort.sortable("refresh");
    }
  }

  updateList(extData, $("#my-list"));
  $(".sortable").sortable();
  $(".sortable").disableSelection();
  $(".add").click(function(e) {
    var dlg = $("<div>", {
      title: "Add To " + $(this).parent().find("p").text()
    });
    var that = $(this);
    dlg.append(
      $("<label>").html("Name"),
      $("<input>", {
        type: "text",
        class: "name txt"
      }),
      $("<label>").html("ID"),
      $("<input>", {
        type: "input",
        class: "id txt"
      })
    );
    dlg.dialog({
      modal: true,
      buttons: [{
        text: "Ok",
        click: function() {
          var d = [{
            label: $(this).find(".name").val(),
            id: $(this).find(".id").val()
          }];
          updateList(d, that.parent());
          $(this).dialog("close");
          $(this).remove();
        }
      }, {
        text: "Cancel",
        click: function() {
          $(this).dialog("close");
          $(this).remove();
        }
      }]
    });
  });
});
.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;
}

.ui-dialog-content label {
  display: block;
}
<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>


<div id="my-list">
  <p>My List</p>
  <ul class="sortable">
  </ul>
  <button id="my-list-add-btn" class="add btn">Add</button>
</div>

如果您有超过 1 个列表,此代码会非常有效,因为它允许您对许多不同的列表使用相同的函数。

希望对您有所帮助。

关于javascript - 在动态创建的 UL 上使用 Sortable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894832/

相关文章:

javascript - 使用 lodash 函数映射柯里化(Currying)过滤器

javascript - 在 Crossrider 中收集事件选项卡 HTML 内容

javascript - 构建网格并使用 jQuery 对齐它

jquery - 如何将 JQuery DataTables "input"插件与 DataTables 1.10 一起使用

JQuery 颜色盒

javascript - 超出最大调用堆栈大小。在对话框中打开

javascript - jQuery UI 错误 - 未捕获的语法错误 : Unexpected Identifier

javascript - JavaScript中如何通过ID获取子元素?

javascript - 数组中对象的 setState

javascript - 某些语言的 SignalR 客户端调用失败