代码之家  ›  专栏  ›  技术社区  ›  Eli

jquery ui:嵌套的可排序错误

  •  3
  • Eli  · 技术社区  · 15 年前

    谢谢你的阅读。

    两个问题:

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

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

    <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期:

    如果你抓取第一个项目,即带有子列表的大项目,并尝试对其重新排序,有时它会尝试掉入自己的子列表,导致错误,然后消失。在拖动开始之前,我可以通过添加一个句柄来绕过这个问题,并在句柄单击时隐藏子列表(使其变小,从而解决了问题),但是其他人能想出一种方法来解决这个问题吗?

    似乎问题在于拖动高度较大的项目。

    浏览器:

    一切都在火狐中。IE似乎根本无法处理嵌套的可排序文件。似乎没有办法从子列表中获取项目。

    谢谢!

    3 回复  |  直到 12 年前
        1
  •  1
  •   Jancha    15 年前
        2
  •  1
  •   Safran Ali    12 年前

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

    $(".myList").sortable({ connectWith: ".myList", appendTo: 'body', helper: 'clone', items: 'li' });
    
        3
  •  0
  •   BMiner    13 年前

    很抱歉恢复了这条线。只想为其他遇到此线程的用户发布。

    我和Eli有着完全相同的问题——使用Chrome8.x。

    eli——为了解决问题2,我从被拖动元素的所有子列表中删除了“mylist”类。我将其更改为“mypublist”,然后在要拖动的列表项上调用.sortable(“refresh”)。最后,我在拖动完成后将其更改回原处(并再次调用refresh)。它防止父项被放入它自己的子列表中并导致错误。您不能在可排序事件的开始事件中调用Sortable(“刷新”)(它无论如何对我都不起作用),因此您必须创建自己的“单击”事件,在可排序事件开始触发之前完成所有这些工作。

    我有一个手柄,所以当用户点击手柄时,我就完成了所有这些工作。

    代码(未经测试,但即使不起作用,您也会得到这个想法):

    $('.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');
    });