使用 jQuery UI 可排序插件添加项目后刷新列表

Posted

技术标签:

【中文标题】使用 jQuery UI 可排序插件添加项目后刷新列表【英文标题】:Refresh list after adding an item with jQuery UI sortable plugin 【发布时间】:2014-04-28 22:28:20 【问题描述】:

好吧,所以我有一个嵌套的可排序列表,因此每个项目既是容器又是可排序元素。

我面临的问题是,每当我添加一个新元素时,我希望 jQuery 用新项目刷新其内部状态。 根据文档,必须调用作为参数“刷新”传递的可排序方法,但我仍然无法使其工作。

示例代码: http://jsfiddle.net/X5sBm/

javascript

$(document).ready(function() 
    var list = $('#mycontainer ul').sortable(
        connectWith: '#mycontainer ul',
        placeholder: 'myplaceholder'
    );

    function addElement(text) 
        $('#mycontainer > ul').append('<li>' + text + '<ul></ul></li>');
        list.sortable('refresh');
    

    addElement('yolo');
);

html

<div id="mycontainer">
    <ul>
        <li>
            Some text
            <ul>
            </ul>
        </li>
        <li>
            Some text 2
            <ul>
            </ul>
        </li>
    </ul>
</div>

CSS:

#mycontainer > ul 
    display: block;


#mycontainer > ul ul 
    min-height: 10px;
    padding-left: 20px;


.myplaceholder 
    background-color: yellow;

尝试将一个已经存在的项目拖到新添加的项目下,即使刷新后也无法这样做。

【问题讨论】:

【参考方案1】:

我找到了一个便宜的解决方法:

我在同一个标​​签上再次调用 sortable,像这样重新初始化 Sortable 插件:

$('#mycontainer ul').sortable(
    connectWith: '#mycontainer ul',
    placeholder: 'myplaceholder'
);

它有效。

【讨论】:

这对我有帮助,我没有意识到我在做什么:我正在添加一个全新的 container 元素,而不是添加到父可排序容器中。这个新元素从未设置过,我的控制台实际上通知了我!从我的臀部拉我的头后,我意识到了这一点。因此,我为可排序选项创建了一个更高范围的对象,然后我可以在我的 AJAX 调用之后重用这些选项。我希望这对其他人有帮助! 这真的有效吗?我遇到了同样的问题,似乎refresh 除了返回错误之外什么也没做(顺便说一句,它是不可修复的,它似乎不适用于嵌套元素)。最终再次复制粘贴整个 sortable() 函数似乎有点不切实际,因为我的代码比上面示例中的这 4 条代码规则要大。谁有更好的答案?【参考方案2】:

关键的理解和要点是使用可排序选项初始化动态创建的&lt;ul&gt;&lt;/ul&gt;。我建议创建一个options 对象以便于重复使用。

$(document).ready(function() 
    const container = $('#mycontainer ul');
    const options = 
        connectWith: '#mycontainer ul',
        placeholder: 'myplaceholder'
    ;
    container.sortable(options);
    
    function addElement(text) 
        let newListItem = $('<li>').text(text);
        newListItem.append($('<ul>').sortable(options)); // <- key concept
        $('#mycontainer > ul').append(newListItem);
        //container.sortable('refresh');
        
    
    
    addElement('yolo');
    
);
#mycontainer > ul 
    display: block;


#mycontainer ul ul 
    min-height: 10px;
    padding-left: 20px;


.myplaceholder 
    background-color: yellow;
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <div id="mycontainer">
      <ul>
          <li>
              Some text
              <ul>
              </ul>
          </li>
          <li>
              Some text 2
              <ul>
              </ul>
          </li>
          <li>
              Some text 3
              <ul>
              </ul>
          </li>
      </ul>
  </div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
</body>
</html>

【讨论】:

以上是关于使用 jQuery UI 可排序插件添加项目后刷新列表的主要内容,如果未能解决你的问题,请参考以下文章

没有 jQuery UI 的 jQuery 可排序

没有 jQuery UI(或根本没有 jQuery?)的可排序/可拖动列表项

jQuery UI - 放置事件后克隆可放置/可排序列表

可排序不是一个函数 Jquery UI

JQuery UI:在 Droppable Drop 时取消排序

排序后从列表中获取可排序的 Jquery-ui 数据