当使用jquery显示元素时,焦点可见性会丢失

Focus visability gets lost when element is shown with jquery

本文关键字:点可见性 jquery 显示 元素      更新时间:2023-09-26

我有一个页面与许多下拉菜单,这是可见的悬停事件,使用css。然而,我也想让他们可见,当我按tab,他们是使用jquery的焦点。我试过了:

和以下发生:

$("body").keydown( function(e) { 
        var keyCode = e.keyCode || e.which; 
        if (keyCode === 9) {
            $("*").bind("focus",function(){
            var $self = $(this);
                if($self.siblings("*:hidden").length > 0){
                    hidden_menu = $self.next("*:hidden");
                    if($(hidden_menu).is("ul")){
                        $(hidden_menu).show();
                        $(hidden_menu).children().addClass("shownhidden");                        
                    }
                }  
                $("*").unbind("focus");            
            })
        }
        $("*").focusout(function(){           
            if(!$(this).next().is(".shownhidden") && $(this).is(".shownhidden")){
                setTimeout(function(){
                    $(hidden_menu).hide();
                },1000)
            }
        });
});
  1. 当鼠标放在每个按钮上时,相应的下拉菜单可见
  2. 之后,我按tab键,当每个按钮聚焦时,相应的菜单可见
  3. 但是在那之后,当我尝试鼠标在按钮上时,相应的菜单不显示。

HTML代码由许多元素组成,如下所示:

           <li id="navMenuButton" class="dropdown">
              <button class="dropbtn">Menu</button>
              <ul class="dropdown-content">
                <li><a href="#">Menu 1</a></li>
                <li><a href="#">Menu 2</a></li>
                <li><a href="#">Menu 3</a></li>
              </ul>
            </li>

这部分的css代码是:

.dropbtn {
    background-color: #9AEDF3;
    padding: 14px;
    border: none;
    cursor: pointer;
}
/* The container <div> - needed to position the dropdown content */
.dropdown {
    position: relative;
    display: inline-block;
}
/* Dropdown Content (Hidden by Default) */
.dropdown-content {
    display: none;
    position: absolute;
    background-color: #f9f9f9;
    min-width: 160px;
    box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
}
/* Links inside the dropdown */
.dropdown-content a {
    color: black;
    padding: 12px 16px;
    text-decoration: none;
    display: block;
}
/* Change color of dropdown links on hover */
.dropdown-content a:hover {background-color: #f1f1f1}
/* Show the dropdown menu on hover */
.dropdown:hover .dropdown-content {
    display: block;
}
/* Change the background color of the dropdown button when the dropdown content is shown */
.dropdown:hover .dropbtn {
    background-color: #3e8e41;
}

有什么问题吗?

您的JQuery函数似乎隐藏了一些您意想不到的东西。因此,当您试图显示菜单块时,什么也显示不出来。

一个快速而简单的测试是在你的CSS文件中修改这个
/* Show the dropdown menu on hover */
.dropdown:hover .dropdown-content {
    display: block;
}

/* Show the dropdown menu on hover */
.dropdown:hover .dropdown-content,  .dropdown:hover li, .dropdown:hover a {
    display: block;
}

如果可以,请继续阅读…

从代码中,您似乎试图仅通过来控制可见性。dropdown-content类(也是ul标签)。我相信你的JQuery类不仅隐藏了ul元素,还隐藏了该标签中的一些元素(最有可能的是li元素)。因为你的CSS没有考虑到这一点,所以它们再也不会显示了。 这里将shownhidden类赋值给ul元素的子元素。(问:你的意思是分配给hidden_menu类本身吗?)
$(hidden_menu).show();
$(hidden_menu).children().addClass("shownhidden"); 

因为li元素也是隐藏的(通过父元素),所以这段代码也匹配它们(它们有一个元素,可以通过兄弟元素测试)。因此,li元素可以赋值给hidden_menu。

$("*").bind("focus",function(){
var $self = $(this);
if($self.siblings("*:hidden").length > 0) {
   hidden_menu = $self.next("*:hidden");
   ...
}

这段代码会隐藏不需要的元素。

$("*").focusout(function(){
    if(!$(this).next().is(".shownhidden") && $(this).is(".shownhidden")){
        setTimeout(function(){
        $(hidden_menu).hide();

如果这就是问题所在(本文开头给出的快速测试),那么你可以:
A)在分配hidden_menu
之前检查类类型B)在使用hidden_menu之前检查类类型(特别是在隐藏之前)
c)添加像上面那样的CSS块,当鼠标悬停

时显示ul元素下的所有内容。