如何使用jQuery UI sortable()将元素拖动到下拉列表中?

5

简短版: 如何将 Link 1 拖动到此演示中 Link 3 下拉菜单中的一个?http://jsfiddle.net/Gdadu/2/

编辑:提出了以下问题:当拖动一项至另一项上方时,应该放在左侧 / 右侧还是开始新子菜单?为了使列表完全可排序,必须有一种方法将项拖放到不存在的子菜单中,即开始新的下拉菜单。我可以在尚未具有

    的每个列表项中插入一个空的 ul 以用作放置目标,但还是存在上述问题。

    这似乎比我最初想象的要困难得多,所以我为没有更多地投入精力而道歉,因为我没有考虑到其中一些问题。我愿意接受对所述问题的回答,稍后再考虑其他问题。


    我有一个基本的下拉导航列表,我希望使用jQuery UI使其完全可排序。li 元素应该能够移动到整个列表的任何位置。我在将顶层列表项拖入子菜单方面遇到了问题,看起来在“拖动模式”下,:hover不会触发下拉列表,因此下拉菜单不会出现。

    HTML示例:

    <ul class="dropdown">
        <li><a href="#">Link 1</a></li>
        <li><a href="#">Link 2</a></li>
        <li><a href="#">Link 3</a>
            <ul>
                <li><a href="#">Link</a></li>
                <li><a href="#">Link</a></li>
                <li><a href="#">Link</a>
                     <ul>
                        <li><a href="#">Link</a></li>
                        <li><a href="#">Link</a></li>
                        <li><a href="#">Link</a></li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>
    

    我的CSS:

    .dropdown,
    .dropdown li,
    .dropdown ul {
        list-style:none;
        margin:0;
        padding:0;
    }
    .dropdown {
        position:relative;
        display:block;
        z-index:10000;
    }
    .dropdown ul {
        position:absolute;
        top:100%;
        width:100%;
        visibility:hidden;
        display:none;
        z-index:900;
    }
    .dropdown ul ul {
        top:0;
        left:100%;
    }
    .dropdown li {
        position:relative;
        float:left;
    }
    .dropdown li:hover{
        z-index:910;
        cursor:default;
    }
    .dropdown ul:hover,
    .dropdown li:hover > ul,
    .dropdown a:hover + ul,
    .dropdown a:focus + ul {
        visibility:visible;
        display:block;
    }
    .dropdown a {
        text-decoration:none;
        display:block;
        padding:.5em 2em;
        background:#cde;
        border:1px solid #ccc;
    }
    .dropdown ul li {
        width:100%;
    }
    

    Sortable 初始化:

    $('.dropdown').sortable({
        items: 'li'
    });
    

    演示:http://jsfiddle.net/Gdadu/2/

    例如,我想将“Link 1”拖到子菜单中,但无法实现,因为在拖动时子菜单不会出现,就好像被忽略了:hover一样。我不确定问题是出在CSS还是javascript上。我该怎么做呢?

    评论区的好主意:

    也许你可以在拖动开始时触发全部展开

    这可能有效,但我不想展开整个菜单。菜单中可能有很多内容,有许多链接和3级导航,可能会重叠而形成大混乱。


2
如果你正在拖动某个物品,那么你会悬停在你正在拖动的物品上方,这会阻挡住它下面的物品... - Fosco
厉害了,编程伙计。我真的很喜欢你在这段代码中所做的事情。 - John Riselvato
据我所知,HTML中的:hover总是被触发,因为它包含了元素。因此,如果您有一个'a'元素,而'b'是'a'的子元素,那么如果您将鼠标悬停在'b'上,'a'也将具有:hover状态。希望我能帮到您。 - 19greg96
在我看来,你似乎有一个逻辑问题。因为你说每个li都应该能够被拖到任何位置,那么当你将item1移动到item2上方时会发生什么:是在顶级列表中交换它们的位置,还是将item1嵌套在item2下面作为子菜单条目1? - kontur
这很聪明,@Frédéric,我认为你可能有所发现。Kontur:由于Link 2没有子菜单,我希望将Link 1放置在Link 2的任一侧,但现在我明白了你的意思-在原本没有下拉菜单的地方无法启动新的下拉菜单...我想知道是否有什么办法解决这个问题,我需要进行更多测试,因为这并不像我最初想象的那样简单。 - Wesley Murch
显示剩余7条评论
1个回答

2
这里有一个示例,展示了一些可以帮助您实现的要点:http://jsfiddle.net/Gdadu/13/ 它远非完美,正如评论中指出的那样,“到处排序一切”也存在一些逻辑问题 :) 这里无法工作的是将嵌套的li排序回顶级,对嵌套的ul进行排序等等,但我认为它们已经在那里勾勒出来了。区分拖动和排序可能是jqueryui当前状态下必要的一件事情。此外,我简化了您出色的子菜单css解决方案,并将其改为基于javascript的解决方案,以简化事情。
但是:您可以将link1放入link3或link3的嵌套ul中;)

我正在研究这个,试图从中创造出一些有用的东西。明晚我会告诉你我的进展如何。 - Wesley Murch
由于其他的任务安排,我将把这个任务搁置大约两个月的时间,所以我会如承诺一样给予这个勾选标记。感谢你的努力尝试,如果我再次回到这个任务,我一定会发布最终的解决方案。 - Wesley Murch
不客气。我曾经遇到过类似的问题,当时我设计了一个CMS界面,在管理员浏览站点时可以进行“实时”导航编辑。从可用性的角度来看,使用不同任务的“辅助按钮”,如拖放或排序,是最清晰的解决方案。 - kontur
是的,绝对没错。通常来说,技术上更简单的解决方案也更容易让用户理解,尽管有可能实现一种更流畅的技术解决方案 :) - kontur
有人在新的声望处理代码的(无害)实验中使用了您的答案。请查看您的声望历史记录(点击页面顶部的分数),您将看到添加和减去了几百分。这没有什么可担心的,但我想让您知道正在发生什么。 - Keith Thompson
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接