【问题标题】:Dropdown links using jQuery .slidetoggle使用 jQuery .slidetoggle 的下拉链接
【发布时间】:2015-08-19 16:50:39
【问题描述】:

我正在使用以下代码使用 .slidetoggle 和 jQuery 创建下拉菜单:

<ul>
    <li class="expand"><span>Dropdown</span>
        <ul class="sub-menu">
            <li style="display: none;"><a href="http://google.com">Foo</a></li>
            <li style="display: none;"><a href="http://google.com">Foo</a></li>
            <li style="display: none;"><a href="http://google.com">Foo</a></li>
        </ul>
    </li>
</ul>

它工作正常,点击 li.expand 显示/隐藏子 li。

问题在于,当点击链接(例如 google.com)时,在大多数浏览器上,菜单首先会在激活链接之前将 ul.sub-menu 向上切换。

如何在单击链接时阻止菜单向上切换?

为澄清起见,上述代码在 Safari 上按要求工作。

JSFiddle 示例(如果需要):https://jsfiddle.net/fcs5n8o6/3/

【问题讨论】:

    标签: jquery slidetoggle


    【解决方案1】:

    添加这个:

    $('.sub-menu').find('a').click(function(event){
         event.stopPropagation();                          
    });
    

    根据event.stopPropagation method,点击链接不会通知 li 元素点击(他们现在这样做),并且 li 的点击处理程序不会触发。

    更新jsfiddle

    还有更好更简洁的解决方案:

    <ul>
        <li class="expand"><span>Dropdown</span>
            <ul class="sub-menu" style="display: none;">
                <li><a href="http://google.com">Foo</a></li>
                <li><a href="http://google.com">Foo</a></li>
                <li><a href="http://google.com">Foo</a></li>
            </ul>
        </li>
    </ul>
    
    <script>
        $(".expand").click(function() {
            $(".sub-menu").slideToggle("slow");
            $('.sub-menu').find('li').click(function(event){
                 event.stopPropagation();                          
            });
        });
    </script>
    

    new jsfiddle

    我还编辑了 jQuery 选择器,它们有点过于旺盛,效率不高。

    至于您的网站: 找到文件 custom.js?ver=1 第 405 行:

    $(".leftnav ul li.removelink.driver").click(function() {
        event.stopPropagation();
        $(".leftnav ul li.removelink.driver li").slideToggle("slow");
    });
    

    为此改变:

    $(".leftnav ul li.removelink.driver").click(function() {
    
            $(".leftnav ul li.removelink.driver li").slideToggle("slow")
            .click(function(event){event.stopPropagation();});
    
        });
    

    【讨论】:

    • 我同意你的看法,先生。
    • 我已经按照你自己和@zer00ne 的建议尝试了这两种变体,但都没有奏效。这是一个指向暂存环境的链接(左侧的侧边栏)以澄清问题:bit.ly/1LkpJNp
    • 我刚刚在 Safari 上打开了 fiddle,一切都按预期工作......你试过更新 fiddle 了吗?它是否表现出不受欢迎的行为?
    • 添加了 bit.ly/1LkpJNp 的解决方案,请尝试一下。
    • @Lunokhod 谢谢你。我已经按照建议更新了 custom.js 中的代码,但仍然有同样的问题。澄清这一点不会影响 Safari。只有 Chrome 和 IE。见视频:youtu.be/PALLROFT70s。第一个浏览器是 Chrome,第二个是 Safari。
    【解决方案2】:

    我觉得你需要event.stopPropagation();

    https://jsfiddle.net/zer00ne/yoggar2z/1/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 2012-09-12
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多