jQuery UI:嵌套的可排序错误

jQuery UI: Nested sortable errors

提问人:Eli 提问时间:9/16/2009 最后编辑:Eli 更新时间:2/29/2012 访问量:4898

问:

感谢您的阅读。

两个问题:

我正在创建一个任务列表类型的系统,它将使用嵌套的可排序列表。

下面是一些非常基本的演示代码:

<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 似乎根本无法处理嵌套的可排序对象。似乎没有办法从子列表中抓取一个项目。

谢谢!

jquery jquery-ui-sortable

评论


答:

1赞 Jancha 9/17/2009 #1

检查这个bug: http://dev.jqueryui.com/ticket/4333

评论

0赞 Eli 9/17/2009
谢谢!我还为这个项目创建了一个错误报告,因为它有几个问题。
1赞 Josh Pearce 11/14/2009 #2

我遇到了类似的问题,我也向JQuery UI提交了一个错误并发布在这里。我有一个演示,我使用了几个额外的可排序选项,它实际上似乎在 IE 中工作正常,但您不能从 FF 中的嵌套列表中拖出。

$(".myList").sortable({ connectWith: ".myList", appendTo: 'body', helper: 'clone', items: 'li' });
0赞 BMiner 1/14/2011 #3

很抱歉恢复这个线程。只是想为偶然发现此线程的其他用户发帖。

我遇到了与 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');
});

评论

0赞 Eli 1/15/2011
甜!我还没有继续努力,但我仍然喜欢提出一个解决方案......