【问题标题】:Dropping an item on a sortable list that only has excluded items在仅包含排除项目的可排序列表中删除项目
【发布时间】:2012-03-20 06:28:30
【问题描述】:

我有几个连接在一起的可排序列表,所以我可以从一个列表中拖动一个项目并将其放入另一个列表中。每个列表的底部也有一个既不可排序也不能放置目标的项目,因此无法放置其下方的任何项目。

这是预期用途,我希望每个列表底部的排除项始终保持在底部。

问题是如果我清空一个列表,比如说我拖出它的所有项目并将它们放在另一个列表中,那么剩下的就是不可排序的项目。如果我随后将一个新项目拖入其中,它将始终位于底部,在我的不可排序、非放置目标项目下方。

是否可以在将新项目放入只有一个不可排序、非放置目标项目的可排序列表中时,将其置于列表顶部?

示例代码:

$('.segment ol').sortable({
  connectWith: '.segment ol',
  distance: 25,
  items: 'li:not(.disabled)'
});

HTML:

    <div class="segment">
      <ol>
        <li>word word word</li>
        <li>word word word</li>
        <li class="disabled">must stay at bottom</li>
      </ol>
    </div>
    <div class="segment">
      <ol>
        <li class="disabled">must stay at bottom</li>
      </ol>
    </div>

如果您要将“word word word”li 拖到另一个列表中,它将被附加到禁用的 li 下方。

【问题讨论】:

  • 请发布一些示例html,以及您尝试过的jquery代码
  • 完成。问题是它不是错误,它只是可排序列表的默认工作方式,我想知道是否有解决方法。

标签: javascript jquery jquery-ui


【解决方案1】:

您可以在可排序列表上使用“receive”事件(当您提供选项时),并执行以下操作:

$('.segment ol').sortable({
    connectWith: '.segment ol',
    distance: 25,
    items: 'li:not(.disabled)',
    over: function(event,ui){ ui.placeholder.insertBefore($(this).children('li.disabled:first')); }
});

这将使当前拖动的元素将自身添加到列表中(prepend 和 prependTo 将有效地移动项目,除非您先克隆它)。

【讨论】:

  • 对。谢谢你。我遇到的问题是,当您拖动项目时,占位符仍将显示在禁用项目下方。所以这就是它应该降落的地方。我希望有一个更加用户友好的解决方案。
  • 嗯,好的,那应该可以解决它。现在,当您将项目移动到连接的可排序列表时,它应该在第一个禁用的 li 之前插入占位符。
  • 是的。那应该行得通。我只是自己想通了,你最初的回答肯定让我走上了正确的轨道。这是我将使用的:over: function(event, ui) { ui.placeholder.prependTo(ui.placeholder.parent()); } 非常感谢!
  • 您可以通过在您的 insertBefore() 周围添加 if($(this).children().length == 2) { } 来解决此问题。由于静态项目加上占位符,它将是 2。
  • 谢谢@JeffB。 if ($(this).children().length == 2) { $(this).prepend(ui.placeholder); } 确实是我遇到的问题的完整答案。
【解决方案2】:

这可能更偏向于黑客方面,但您可以在每个 0px 高或 display: none 的列表顶部添加一个可排序项目。这将强制该项目在该项目之后排序,而不是您的不可排序项目。

<ol>
    <li class="hidden"></li>
    <li>word word word</li>
    <li>word word word</li>
    <li class="disabled">must stay at bottom</li>
</ol>

CSS:

.hidden {
   display: none;
}

http://jsfiddle.net/HPM7V/2/

【讨论】:

  • 其实我更喜欢这个。这样我就不必担心手动覆盖占位符的怪癖,正如另一个答案所暗示的那样。一旦列表中有一个项目,我希望它是 100% 默认的。这条路线实现了这一点。我删除了隐藏的 li ,并将其添加到移动后为空的任何列表中。谢谢你的想法。
猜你喜欢
  • 2013-06-10
  • 2012-06-26
  • 2019-09-07
  • 1970-01-01
  • 2014-01-15
  • 2013-11-02
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多