提问人:Eli 提问时间:9/16/2009 最后编辑:Eli 更新时间:2/29/2012 访问量:4898
jQuery UI:嵌套的可排序错误
jQuery UI: Nested sortable errors
问:
感谢您的阅读。
两个问题:
我正在创建一个任务列表类型的系统,它将使用嵌套的可排序列表。
下面是一些非常基本的演示代码:
<script>
$(function(){
$('.sortable_test > li').attr('style', 'border:1px solid red; padding:3px; margin:2px;');
$('.sortable_test').sortable({
distance: 5,
connectWith: ['.sortable_test'],
placeholder: 'ui-state-highlight',
forcePlaceholderSize: true
});
})
</script>
<ul class='sortable_test'>
<li>
Item
<ul class='sortable_test'>
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
</ul>
</li>
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
<li>
Item
</li>
</ul>
问题 1:
如果您尝试从嵌套的子列表中拖动一个项目,在该列表中,它会很好地工作。如果您尝试对主列表中的项目重新排序,则相同。
但是,如果您想将项目从子列表拖到主列表,反之亦然,则可以这样做,但占位符不会立即出现,它会尝试将其保留在同一列表中。你必须把它拖到各处,然后它才会注册到你结束的列表中。
最终,它似乎意识到你想进入或退出一个子列表,但它非常生涩。
我在想,也许对哪个列表的优先级感到困惑,因为从技术上讲,您正在拖过两者。
因此,如果您尝试将一个项目从主列表拖到子列表,它会将整个子列表视为单个项目,并尝试将其移动到它上面。
有人遇到过这种情况吗?有什么想法吗?也许有一种方法可以指定哪个列表具有优先权,或者让插件更清楚地知道您对哪个列表感兴趣?
问题 2:
如果你抓住第一项,即带有子列表的大项目,并尝试重新排序它,有时它会尝试放入它自己的子列表,导致错误,然后消失。我可以通过添加一个句柄,并在句柄单击时隐藏子列表(使其尺寸更小,从而解决问题)来解决此问题,然后再拖动开始,但是其他人能想出一种方法来解决这个问题吗?
似乎问题出在拖动一个高度较大的项目上。
浏览器:
这一切都在Firefox中。IE 似乎根本无法处理嵌套的可排序对象。似乎没有办法从子列表中抓取一个项目。
谢谢!
答:
检查这个bug: http://dev.jqueryui.com/ticket/4333
评论
我遇到了类似的问题,我也向JQuery UI提交了一个错误并发布在这里。我有一个演示,我使用了几个额外的可排序选项,它实际上似乎在 IE 中工作正常,但您不能从 FF 中的嵌套列表中拖出。
$(".myList").sortable({ connectWith: ".myList", appendTo: 'body', helper: 'clone', items: 'li' });
很抱歉恢复这个线程。只是想为偶然发现此线程的其他用户发帖。
我遇到了与 Eli 完全相同的问题——使用 Chrome 8.x。
Eli -- 为了解决问题 2,我从被拖动的元素的所有子列表中删除了“myList”类。我将其更改为“mySubList”,然后在正在拖动的列表项上调用 .sortable('refresh')。最后,一旦拖动完成,我就会将其改回(并再次调用 refresh)。这样可以防止将父项放入其自己的子列表之一并导致错误。您不能在可排序事件的开始事件中调用 sortable('refresh')(反正它对我不起作用),因此您必须创建自己的“click”事件,在可排序事件开始触发之前完成所有这些工作。
我有一个句柄,所以我只是在用户单击句柄时完成所有这些工作。
代码(未经测试,但即使它不起作用,你也会明白这个想法):
$('.sortable_test').sortable({
distance: 5,
connectWith: ['.sortable_test'],
placeholder: 'ui-state-highlight',
forcePlaceholderSize: true
}).find('li').click(function() {
$(last_selected_li).find('.mySubList').removeClass('mySubList').addClass('myList').end().sortable('refresh');
$(this).find('.myList').removeClass('myList').addClass('mySubList').end().sortable('refresh');
});
评论