javascript - 使用 Shift + Tab 为父项时运行 JS

标签 javascript jquery html

目前,我有一个下拉菜单,每当用户切换时都会显示该菜单。现在,我尝试添加功能,以便每当用户 Shift + Tab 返回父项时隐藏下拉菜单。我尝试使用 focus()blur() 但它会在它实际向上运行之前运行,如果我在第二个子项目上并将选项卡移回首先,我收到以下警报:

$('#menu-main-menu ul.submenu li:first-child a').blur().on('keyup', function(e){
    if(e.which == 9 && e.shiftKey){
        alert('shift');
    }
});

我也 created a JSFiddle以运行此代码为例。

每当用户按 Shift + Tab 键返回到列表中的父项时,如何运行一些 JS 代码?

最佳答案

真正的问题是用户将焦点从子项移至父项,但子项在应该保持可见时却消失了。解决方案是在隐藏菜单项之前使用setTimeout。父项需要监听自身的“焦点”事件,然后取消setTimeout

setTimeout到期并执行回调函数时,只有然后才应该隐藏子菜单。

JsFiddle:http://jsfiddle.net/bL1p8gwk/5/

$("#mainmenu>li").each(function(idx, menu) {
    console.info("Create menu: ", idx, menu);

    var timeout = 250,
        timer = null,
        $currentItem = null,
        hideMenu = function() {
            console.info("Hide menu " + idx + ": ", $currentItem);
            $currentItem.next("ul.submenu").hide();
            $currentItem.closest("ul.submenu").hide();
            timer = null;
            $currentItem = null;
        };

    $(menu)
        .on("focusout", function(event) {
            $currentItem = $(event.target);
            timer = setTimeout(hideMenu, timeout);
        })
        .on("focusin", function(event) {
            console.info("Focusin: " + idx);

            if (timer) {
                console.info("Stop timer " + idx + ": " + timer);
                clearTimeout(timer);
                timer = null;
            }

            console.info("Show sub menu: " + idx);
            $(event.target).next("ul.submenu").show();
        });
});

和 HTML:

<ul id="mainmenu">
    <li>
        <a href="javascript:void(0);">Products</a>
        <ul class="submenu" style="display: none">
            <li><a href="javascript:void(0);">Search</a></li>
            <li><a href="javascript:void(0);">Featured</a></li>
        </ul>
    </li>
    <li>
        <a href="javascript:void(0);">Services</a>
        <ul class="submenu" style="display: none">
            <li><a href="javascript:void(0);">Commercial</a></li>
            <li><a href="javascript:void(0);">Government</a></li>
        </ul>
    </li>
</ul>

关于javascript - 使用 Shift + Tab 为父项时运行 JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25790651/

相关文章:

javascript - 查找在 word 包装元素中如何拆分行

javascript - Cordova 应用程序未显示与本地主机网站上相同的内容

java - 在 Web 服务中使用 htmlunit 时抛出的异常是什么意思?

html - 使用教程包在 ioslides 演示中使用 datacamp light 练习

javascript - HighCharts:类别值重复。工具提示未显示正确的日期

javascript - 在 react 中读取excel文件

jquery - Firefox 操作系统特权应用程序错误 : call to eval() blocked by csp at jquery 1. 9.1

javascript - jQuery datepicker 获取类 'hasDatepicker' 但不显示 datepicker

javascript - 未触发 child 的点击事件

javascript - 如何访问未初始化的状态 Hook 的属性?