【发布时间】:2014-03-07 17:24:53
【问题描述】:
我见过几个关于在放置时交换两个可拖动元素的问题,但我的情况有点不同。
基本上,我在(非线性)网格中布置了一堆可拖动元素。在许多情况下,网格将完全填充数据。我们希望允许用户轻松地重新排列网格元素,但由于网格是非线性的,使用“可排序”不是一种选择。而且由于网格已完全填充,当一个网格位置被拖到另一个网格位置时直接交换两个网格位置并不是理想的解决方案(因为我们并不是试图将三个位置重新排列成某种脑筋急转弯)。
我们想要做的是在拖动网格元素(称为 A)时发生正常的“拖动”操作,但是当元素被拖放到所需的目标(其中已经有另一个网格项)时,称为 B),然后 A 应该取代 B 的位置,然后 B 应该“捕捉”鼠标光标,就像用户单击并拖动它一样。这显然会稍微弄乱鼠标交互,因为现在用户没有按下鼠标按钮,而是在拖动一个元素,所以要释放元素,他要么单击 A 来自的空单元格,要么单击另一个网格元素 C ,此时 B 将取代 C 的位置,C 现在将“附加”到鼠标光标上。
我仔细研究了“可拖动”文档和源代码,似乎没有办法完全按照我想要的方式配置它,但我很确定我可以扩展可拖动小部件并覆盖它的几个方法来实现我想要的,而不必从头开始编写我自己的解决方案。如果它使它变得更容易,那么与拖动事件相比,用于触发拖动的鼠标事件是否是单击对我来说真的无关紧要。
要清楚,这是我正在寻找的一种交互图:
Original Setup - ^ is mouse cursor
[A] ^ [C]
[B] [D]
Now click and drag on A. Result is:
[ ]^A [C]
[B] [D]
Now drag over B and release. Result is:
[ ] [C]
[A]^B [D]
B is now acting as if it's being dragged, but mouse button is not held down. Move
cursor over C and click mouse button. Result is:
[ ] [B] ^C
[A] [D]
B has taken C's place, and C is now following the mouse cursor. Again, mouse
button is not being held down. Move cursor over empty cell and click mouse
button. Result is:
[C] ^ [B]
[A] [D]
Now there is nothing attached to the mouse cursor.
【问题讨论】:
-
在真正尝试实现这一点之前,我会在ux.stackexchange.com(用户体验)中四处询问,因为我觉得这有点烦人,你可能混淆用户。也许他们会更习惯于定期交换
-
谢谢,但是交互已经通过了测试,无论如何这都是针对“训练有素的”用户群的——有了正确的反馈和可供性,我们的测试用户就可以毫不费力地弄清楚这一点。不过我很欣赏这个建议。
-
澄清一下,这实际上是一个“括号”风格的游戏,其中可能有 128 名参赛者,分为两列,每列 64 人。使用“可排序”是不可能的,因为实际上有许多不同的固定大小的列表,“溢出”一个列表会让我回到这个位置。我们尝试了交换,但因为你实际上不能一次看到所有团队以获得一个大括号,当交换导致一个团队“消失”(因为它交换到屏幕外的位置)时,用户会感到困惑。交换奇数个位置也比我们的用户喜欢的要困难。
标签: javascript jquery jquery-events jquery-ui-draggable jquery-ui-droppable