【发布时间】:2015-09-15 20:54:24
【问题描述】:
我正在使用拖放功能来允许用户对页面上的元素进行排序。我有几个 <ul> 元素,其中有 <li> 元素(所有 <ul> 包含 3 个 <li> 元素),其中每个无序列表对应一个月,所以
<ul class="dragable" id="month-june">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<ul class="dragable" id="month-july">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<ul class="dragable" id="month-august">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<!-- etc.. -->
一旦发生.drop() 事件,我想以某种方式对所有列表进行排序(基本上用户在拖动项目后将其放置到位)。我正在更改 dom 中的列表位置,因此它们总是在那里排序,例如,如果 8 月的第 3 项在 7 月在第 1 项和第 2 项之间移动,它将如下所示:
<ul class="dragable" id="month-july">
<li>Item 1</li>
<li>Item 3</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
现在我需要弄清楚如何将第 3 项从 7 月下推到 8 月的无序列表,并在它之后下推所有其他项。如果例如从 6 月的第 1 项被拖到第 2 项和第 3 项之间的 7 月,这应该具有反之亦然的效果,在这种情况下,它上面的所有内容都应该向左移动。因此,我需要在任何给定时间在所有列表中都有 3 个项目。
这是进一步显示它的图像,希望能更好地解释它:(将中间部分视为初始部分,而不是箭头显示项目被拖动的位置以及它之前和之后的列表会发生什么取决于位置)
这是否可以在不使用 id 或类的情况下完成,而是依赖下一个和上一个元素(无序列表),因为在这种情况下,我不知道确切的月份。
这是一个非常简单的 js fiddle 拖放行为:DEMO
【问题讨论】:
-
你可以创建一个 jsfiddle,jsfiddle.net
-
@dreamweiver 刚刚添加到问题底部
-
只是为了总结您的要求,1. 您希望在每次拖放后对列表进行排序。 2.如果目标列表包含新项目,则应将其删除。 3.总体上不应该有任何重复。
-
2 - 不确定你的意思,不应该删除任何元素,只是相应地改变位置,除了你总结的所有声音都是正确的。
-
@dreamweiver 如果有帮助:api.jqueryui.com/1.10/sortable/#event-activate 我相信更改事件是应该进行排序的事件
标签: javascript jquery list dom