【问题标题】:JQuery UI .sortable button to remove from current list and return to original listJQuery UI .sortable 按钮从当前列表中删除并返回到原始列表
【发布时间】:2012-11-22 15:23:26
【问题描述】:

我想在移动的项目上附加一个按钮,单击该按钮将从列表中删除该项目并将其返回到其原始位置。 This plugin 具有我正在寻找的功能,但我已经搜索了一整天,看起来 .sortable 中缺少此功能。

我所拥有的结构是:

<ul class="sortable">
  <li class="parent old">
    <h3 class="heading">User 1</h3>
    <a class="remove">X</a>
    <ul class="sortable">
      <li class="ui-state-default old">
        <h3>My Image</h3>
      </li>
      <li class="ui-state-default old">
        <h3>My Image 2</h3>
      </li>
    </ul>
  </li>
</ul>

这是 js:

$('.sortable').sortable({
    connectWith: [".newList"],
    handle: "h3",
    cursor: "move",
    placeholder: "placeHolder",
    opacity: 0.5,
    items: ".old",
    clone: "helper",
    revert: true
});
$('.remove').click(function(){
    $(this).prevAll('.parent:first').remove();
});

尝试不同的东西我可以成功地调用 .sortable("destroy") 但如果它不会再次出现在原始列表中,那就没有用了。我一直在研究here in this fiddle 的另一种可能(不理想)的解决方案。基本上我对这个解决方案的想法是为按钮添加一个破坏,它总是在原始列表中。这里的问题是,如果相应的项目从新列表中销毁,我确实需要至少从原始列表中隐藏它并显示它。所以理想情况下,如果可能的话,我想用 .sortable 来做到这一点。

【问题讨论】:

    标签: jquery jquery-ui jquery-ui-sortable nested-sortable


    【解决方案1】:

    借用 jQuery Sortable 示例,这似乎与您想要的非常相似。

    关键在 Sortable 的 connectWith 属性中。此属性可以单向设置。这使您可以使用可以维护的特定排序设置初始列表,同时允许根据需要将项目拖到辅助列表中。示例:http://jsfiddle.net/rvAgL/

    html:

    <ul id="sortable1" class="connectedSortable">
        <li class="ui-state-default">Item 1</li>
        <li class="ui-state-default">Item 2</li>
        <li class="ui-state-default">Item 3</li>
        <li class="ui-state-default">Item 4</li>
        <li class="ui-state-default">Item 5</li>
    </ul>
    
    <ul id="sortable2" class="connectedSortable">
        <li class="ui-state-highlight">Item 1</li>
        <li class="ui-state-highlight">Item 2</li>
        <li class="ui-state-highlight">Item 3</li>
        <li class="ui-state-highlight">Item 4</li>
        <li class="ui-state-highlight">Item 5</li>
    </ul>​
    

    js:

    $(function() {
            $( '#sortable1').sortable({
                connectWith: ".connectedSortable"
            }).disableSelection();
            $('#sortable2').sortable({
                update:function(ev, ui){
                    var widget = $(this);
                    var removeButton = $("<span>X</span>").click(function(){
                        var parentLi = $(this).parent();
                        $(this).remove();
                        parentLi.appendTo($('#sortable1'))
                         $('#sortable1 li').sort(asc_sort).appendTo($('#sortable1'));
                    });
                    $(ui.item).append(removeButton);
                }
            }).disableSelection();
    
        function asc_sort(a, b){
            return ($(b).text().toUpperCase()) < ($(a).text().toUpperCase());    
        }
    
    });​
    

    一点css:

     #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0 0 2.5em; float: left; margin-right: 10px; cursor:pointer }​
    

    【讨论】:

    • 这似乎可以解决问题。看起来我试图在第一个 sortable 上做所有事情,而在第二个 sortable 上什么都不做。谢谢你,但你能解释一下这个函数的作用吗?谢谢。函数 asc_sort(a, b){ return ($(b).text().toUpperCase())
    • 这是按字母顺序对列表项本身进行排序。 (我使用 toUpperCase 使字母排序不区分大小写。)这是确保第一个列表具有固定顺序的原因。
    • 我注意到一个小错误。在你的小提琴中,你可以重现这个:将一个项目移动到第二个列表中,添加 X。然后将项目向下移动到任何其他位置,例如将其从插槽 1 移动到插槽 4。每次移动它都会添加另一个 X。然后,如果您单击 X,它将返回原始列表,其中额外的 X 减去您单击的那个。
    • 有许多小事情不会完全按照您的意愿行事。我只在最后添加了 X 行为以更好地模拟您正在寻找的内容。由于 sortable 可以做你想做的事情只是一个概念验证,我没有花任何时间添加或优化其他功能。然而,本着善意的精神,这里有一个更新的例子:jsfiddle.net/rvAgL/2
    • 哦,好的。我实际上认为它是插件的一部分,并认为它应该像那样工作,没有意识到它只是一个证明。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多