我有两个部分工作的地方有两个UL,它们都有jQuery UI .sortable()
。用户可以并且可能应该将LI从一个丢弃到另一个。我希望第二个列表真的可以排序,但是第一个列表保留了一个排序,而不是如果用户点击它,则从末尾附加的第二个列表中获得LI。
我看到一种非常明显的方法:保留LI的值的JavaScript列表,或者交替设置data-index='0'
(然后,1,2,3等),然后在任何一种情况下,都可以对恐惧气泡进行单一的,可能是自下而上的扫描。
在我看来,我可以直接开始工作,但它有一个" 如果您这样做,那么你的工作太低了 "代码味道给我。除了冒泡排序参考之外,在我认为O(n)确实可以容忍的情况下,似乎知道jQuery UI的人可以产生更短更清晰的实现。
我已经概述了解决问题的难点。我应该考虑哪些简单的方法。
答案 0 :(得分:1)
稍微犹豫了一下之后,我决定采用明显的解决方案,即使它没有像通常的jQuery最佳解决方案那样闻起来。我在生成它们的服务器端代码中向原始LI添加了一个升序整数data-
字段,并且客户端创建了一个单独的冒泡排序迭代函数,如果除了最后一个项目之外都应该有效(重新添加项目)从最后开始)是有序的:
var get_index = function(node)
{
return parseInt(jQuery(node).attr('data-sort-position'));
};
var sort_available = function()
{
var len = jQuery('#available > li').length;
if (len >= 2)
{
var moved = false;
for(var index = 0; index < len; index += 1)
{
if (!moved)
{
if (get_index(jQuery('#available > li')[index]) >
get_index(jQuery('#available > li')[len - 1]))
{
var node = jQuery(
jQuery('#available > li')[len - 1]).detach();
jQuery(node).insertBefore(
jQuery('#available > li')[index]);
moved = true;
}
}
}
}
};
然后我在处理程序的末尾添加了sort_available()
调用,当单击另一个目标列表的成员时调用该句柄:
jQuery('#included li').click(function(event)
{
jQuery(event.target).detach();
jQuery('#available').append(event.target);
assign_clicks();
sort_available();
});
现在它似乎把物品放回原来的位置。