javascript - 哪个事件用于下拉菜单 - 悬停时子菜单关闭?

标签 javascript jquery html css drop-down-menu

所以我有一个包含许多子下拉菜单的导航。

目前我正在使用悬停事件打开子菜单(悬停在父级 a 或箭头图标上)。

问题:每次我尝试将鼠标悬停在子菜单和子菜单的子菜单上时,它都会关闭。

在下面的 fiddle 中:尝试慢慢地悬停到子菜单(它们关闭)

这很烦人。我使用了错误的事件还是切换方法错误?

	/* NAVIGATION ON CLICK */

// Primary menu drop down (mobile)
$( ".dropdown-toggle" ).click(function() {
	$(this).parent().find(".sub-menu:first" ).toggleClass("toggle-on");
});


/* NAVIGATION ON HOVER */
// Sub menu drop down 
 $(".main-navigation ul li.menu-item-has-children").hover(function() {
 	$(this).find(".sub-menu:first").toggleClass("toggle-on");
 });

$(".primary-toggle").click(function() {
 	$(" .main-navigation ul:first").toggleClass("toggle-on");
});

// $(".main-navigation li.menu-item-has-children").mouseleave(function() {
//   $(".sub-menu").removeClass("toggle-on");
// });
	 /* 
		# HEADER
	 */
	 *, html {
	 	margin: 0;
	 	font-size: 22px;
	 }
	 .site-header {
	 	background-color: black;
	 	display: flex;
	 	justify-content: space-between;
	  	align-items: center;
	   	padding: 1rem;
	 }

	/* Burger Nav Styling */
	#sidebar-btn {
	 	vertical-align: middle;
	 	width: 40px;
		height: 25px;
		cursor: pointer;
		margin:10px;
	 	position: relative;
		top: 4px;
		
	}
	#sidebar-btn span {
		height: 2px;
		background: black;
		margin-bottom: 5px;
		display: block;
	}
	#sidebar-btn span:nth-child(2) {
		width: 75%;
	}
	#sidebar-btn span:nth-child(3) {
		width: 50%;
	}


	 /* Main Menu */
	 .main-navigation {
	 }


	/*.main-navigation .menu {
		display: none;
		padding: 1rem;

	 }	*/

	.menu-test-container {
		position: absolute;
		top: 90px;
		left: 0;
		width: 100%;

	}
	.main-navigation .menu.toggle-on {
		display: block;
	}

	 .main-navigation ul {
	 		display: none;
		/*padding: 0 1rem;*/
	 	position: relative;
	 	background-color: yellow;

	  }

		.main-navigation ul li {
			min-width: 140px;
			margin-right: 20px
		}
			 .main-navigation ul li a {
			 	color: #fff;
			 	padding: 10px;
			 	text-decoration: none;
			 }

	 

	/* SUB Menu styles */
	 .sub-menu.toggle-on {
	 	display: block;	
	 }

	 .main-navigation ul, .main-navigation ul ul, .main-navigation ul ul ul  {
	 	list-style: none;
	 	display: none;
	 	   margin-left:0;
	    padding-left:0;
	 }

	/* Positioning x y of EACH sub menus */
	  .main-navigation ul ul {
	  	
	  	background-color: pink;
	   }

	  .main-navigation ul  ul ul {
	  	left: 150px;
	  	top: 0;
	  	background-color: blue;
	   }

	   .main-navigation ul ul ul ul {
	   	background-color: green;
	   	top: 20px;
	   	left: 0;
	   }
	   .main-navigation ul ul ul ul ul {
	   	background-color: black;		
	   	top:0px;
	   	left: 200px;
	  }
	    .main-navigation ul ul ul ul ul ul {
	   	background-color: silver;		
	   	top:0px;
	   	left: 200px;
	  }

	@media  only screen and (min-width: 468px) {
	.site-header {
		flex-direction: column;
	}
		/* Main Navigation - Getting rid of navburger */
		#sidebar-btn {
			display: none;
		}

		.primary-toggle {
			display: none;
		}

		.main-navigation .menu.toggle-on {
			display: flex;
			background-color: blue;
		}
		.main-navigation  ul {
			display: flex;
			align-items: center;
			flex-direction: row;
			justify-content: space-between;
			background-color: blue;

		}

		.menu-test-container {
			display: block;
			position: relative;
			top: 0;
		}	/* end of */

		.main-navigation ul ul {
			position: absolute;
				  	/*left: 7.3rem;*/
		}
		.main-navigation ul ul ul {
			left: 7.3rem;
		}
	 
	}

	 /* TABLET MENU */  
	@media  only screen and (min-width: 768px) {
		.site-header {
		flex-direction: row;
	}
		body {
			background-color: yellow;
		}
		/* Main Navigation - Getting rid of navburger */
		#sidebar-btn {
			display: none;
		}

		.primary-toggle {
			display: none;
		}

		.main-navigation .menu.toggle-on {
			display: flex;
			background-color: blue;
		}
		.main-navigation  ul {
			display: flex;
			align-items: center;
			flex-direction: row;
			justify-content: space-between;
			background-color: blue;

		}
		.menu-test-container {
			display: block;
			position: relative;
			top: 0;
		}	/* end of */
	 	
	 	/* Sub menu navigation tablet */
	 	/* Positioning x y of EACH sub menus */
		  .main-navigation ul ul {
		  	position: absolute;
		  	background-color: pink;
	 	   }


		  		.main-navigation ul ul li {
		  			padding: 7px 1px;
		  		}

		  		.main-navigation ul ul li a {
		  			font-size: 90%;
		  				  	padding: 10px 10px;

		  		}

		  .main-navigation ul  ul ul {
		  	left: 7.3rem;
		  	top: 1px;
		  	background-color: blue;
		   }

		   .main-navigation ul ul ul ul {
		   	background-color: green;
		   	top: 20px;
		   	left: 0;
		   }
		   .main-navigation ul ul ul ul ul {
		   	background-color: black;		
		   	top:0px;
		   	left: 200px;
		  }
		    .main-navigation ul ul ul ul ul ul {
		   	background-color: silver;		
		   	top:0px;
		   	left: 200px;
		  }

	}


	 


	 
<html>
<head>
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<script src="https://use.fontawesome.com/c083bcc66d.js"></script>
</head>
<body>
<header id="masthead" class="site-header">

		<div class="site-branding">
			<div class="site-branding-text">
				<p class="site-title"><a href="http://localhost/wordpress/" rel="home">LOGO</a></p>
			</div>
		</div><!-- .site-branding -->

		<nav id="site-navigation" class="main-navigation">
			<button class="primary-toggle" aria-expanded="false">
				<div id="sidebar-btn">
					<span></span>
					<span></span>
					<span></span>				
				</div>   
			</button>
			<div class="menu-test-container">
				<ul id="primary-menu" class="menu" aria-expanded="true">
					<li id="menu-item-2035" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2035">
						<a href="http://localhost/wordpress/services/">Services</a>
						<span class="dropdown-toggle" aria-expanded="false">
							<span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
						</span>
						<ul class="sub-menu">
							<li id="menu-item-2076" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2076">
								<a href="http://localhost/wordpress/asd/">Commercial</a>
								<span class="dropdown-toggle toggled-on" aria-expanded="true">
									<span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>

								</span>
								<ul class="sub-menu">
									<li id="menu-item-2082" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2082">
										<a href="http://localhost/wordpress/asd/">Rural</a>
										<span class="dropdown-toggle toggled-on" aria-expanded="true">
										  <span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>

										</span>
										<ul class="sub-menu">
											<li id="menu-item-2081" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2081">
												<a href="http://localhost/wordpress/services/">Electrical</a>
												<span class="dropdown-toggle" aria-expanded="false">
													<span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
												</span>
												<ul class="sub-menu">
													<li id="menu-item-2079" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2079">
														<a href="http://localhost/wordpress/gallery/">Residential</a>
														<span class="dropdown-toggle" aria-expanded="false">
															<span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
														</span>
														<ul class="sub-menu">
															<li id="menu-item-2083" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2083"><a href="http://localhost/wordpress/news-updates/">News Updates</a></li>
														</ul>
													</li>
												</ul>
											</li>
										</ul>
									</li>
								</ul>
							</li>
							<li><a href="#"> asdasd</a></li>
							<li><a href="#"> asdasd</a></li>
							<li><a href="#"> asdasd</a></li>
						</ul>
					</li>
					<li id="menu-item-2084" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2084">
						<a href="http://localhost/wordpress/asd/">Projects</a>
					</li>
					<li id="menu-item-2045" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2045">
						<a href="http://localhost/wordpress/blog/">Blog</a>
						<span class="dropdown-toggle" aria-expanded="false">
							<span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
						</span>
						<ul class="sub-menu">
							<li id="menu-item-2078" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2078">
								<a href="http://localhost/wordpress/news-updates/">About</a>
								<span class="dropdown-toggle" aria-expanded="false">
									<span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
								</span>
								<ul class="sub-menu">
									<li id="menu-item-2099" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2099">
										<a href="http://localhost/wordpress/news-updates/">News Updates</a>
									</li>
								</ul>
							</li>
						</ul>
					</li>
				</ul>
			</div>		
		</nav><!-- #site-navigation -->
		<link rel="stylesheet" type="text/css" href="style.css">
</header>
	<script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous"></script>
<script src="script.js"></script>
</body>
</html>

最佳答案

我建议你设置一个.setTimeout()在 mouseleave 上清除 mouseenter 上的超时。因此,如果 mouseenter 发生的时间少于延迟设置的时间,则 mouseleave 上要做的事情将不会完成。

.hover()允许定义两个不同的处理程序,使用它们!

var menu_timeout;

$("#site-navigation li").hover(
  function(){  // Mouseenter
    var that = $(this);
    that.find(".sub-menu:first").addClass("toggle-on");
    clearTimeout(menu_timeout);
  },
  function(){  // Mouseleave
    var that = $(this);
    menu_timeout = setTimeout(function(){
      that.find(".sub-menu:first").removeClass("toggle-on");
    },250);
  }
);
/* 
# HEADER
*/
*, html {
  margin: 0;
  font-size: 22px;
}
.site-header {
  background-color: black;
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem;
}

/* Burger Nav Styling */
#sidebar-btn {
  vertical-align: middle;
  width: 40px;
  height: 25px;
  cursor: pointer;
  margin:10px;
  position: relative;
  top: 4px;

}
#sidebar-btn span {
  height: 2px;
  background: black;
  margin-bottom: 5px;
  display: block;
}
#sidebar-btn span:nth-child(2) {
  width: 75%;
}
#sidebar-btn span:nth-child(3) {
  width: 50%;
}


/* Main Menu */
.main-navigation {
}


/*.main-navigation .menu {
display: none;
padding: 1rem;

}  */

.menu-test-container {
  position: absolute;
  top: 90px;
  left: 0;
  width: 100%;

}
.main-navigation .menu.toggle-on {
  display: block;
}

.main-navigation ul {
  display: none;
  /*padding: 0 1rem;*/
  position: relative;
  background-color: yellow;

}

.main-navigation ul li {
  min-width: 140px;
  margin-right: 20px
}
.main-navigation ul li a {
  color: #fff;
  padding: 10px;
  text-decoration: none;
}



/* SUB Menu styles */
.sub-menu.toggle-on {
  display: block;  
}

.main-navigation ul, .main-navigation ul ul, .main-navigation ul ul ul  {
  list-style: none;
  display: none;
  margin-left:0;
  padding-left:0;
}

/* Positioning x y of EACH sub menus */
.main-navigation ul ul {

  background-color: pink;
}

.main-navigation ul  ul ul {
  left: 150px;
  top: 0;
  background-color: blue;
}

.main-navigation ul ul ul ul {
  background-color: green;
  top: 20px;
  left: 0;
}
.main-navigation ul ul ul ul ul {
  background-color: black;    
  top:0px;
  left: 200px;
}
.main-navigation ul ul ul ul ul ul {
  background-color: silver;    
  top:0px;
  left: 200px;
}

@media  only screen and (min-width: 468px) {
  .site-header {
    flex-direction: column;
  }
  /* Main Navigation - Getting rid of navburger */
  #sidebar-btn {
    display: none;
  }

  .primary-toggle {
    display: none;
  }

  .main-navigation .menu.toggle-on {
    display: flex;
    background-color: blue;
  }
  .main-navigation  ul {
    display: flex;
    align-items: center;
    flex-direction: row;
    justify-content: space-between;
    background-color: blue;

  }

  .menu-test-container {
    display: block;
    position: relative;
    top: 0;
  }  /* end of */

  .main-navigation ul ul {
    position: absolute;
    /*left: 7.3rem;*/
  }
  .main-navigation ul ul ul {
    left: 7.3rem;
  }

}

/* TABLET MENU */  
@media  only screen and (min-width: 768px) {
  .site-header {
    flex-direction: row;
  }
  body {
    background-color: yellow;
  }
  /* Main Navigation - Getting rid of navburger */
  #sidebar-btn {
    display: none;
  }

  .primary-toggle {
    display: none;
  }

  .main-navigation .menu.toggle-on {
    display: flex;
    background-color: blue;
  }
  .main-navigation  ul {
    display: flex;
    align-items: center;
    flex-direction: row;
    justify-content: space-between;
    background-color: blue;

  }
  .menu-test-container {
    display: block;
    position: relative;
    top: 0;
  }  /* end of */

  /* Sub menu navigation tablet */
  /* Positioning x y of EACH sub menus */
  .main-navigation ul ul {
    position: absolute;
    background-color: pink;
  }


  .main-navigation ul ul li {
    padding: 7px 1px;
  }

  .main-navigation ul ul li a {
    font-size: 90%;
    padding: 10px 10px;

  }

  .main-navigation ul  ul ul {
    left: 7.3rem;
    top: 1px;
    background-color: blue;
  }

  .main-navigation ul ul ul ul {
    background-color: green;
    top: 20px;
    left: 0;
  }
  .main-navigation ul ul ul ul ul {
    background-color: black;    
    top:0px;
    left: 200px;
  }
  .main-navigation ul ul ul ul ul ul {
    background-color: silver;    
    top:0px;
    left: 200px;
  }

}
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <script src="https://use.fontawesome.com/c083bcc66d.js"></script>
</head>
<body>
<header id="masthead" class="site-header">

    <div class="site-branding">
      <div class="site-branding-text">
        <p class="site-title"><a href="http://localhost/wordpress/" rel="home">LOGO</a></p>
      </div>
    </div><!-- .site-branding -->

    <nav id="site-navigation" class="main-navigation">
      <button class="primary-toggle" aria-expanded="false">
        <div id="sidebar-btn">
          <span></span>
          <span></span>
          <span></span>        
        </div>   
      </button>
      <div class="menu-test-container">
        <ul id="primary-menu" class="menu" aria-expanded="true">
          <li id="menu-item-2035" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2035">
            <a href="http://localhost/wordpress/services/">Services</a>
            <span class="dropdown-toggle" aria-expanded="false">
              <span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
            </span>
            <ul class="sub-menu">
              <li id="menu-item-2076" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2076">
                <a href="http://localhost/wordpress/asd/">Commercial</a>
                <span class="dropdown-toggle toggled-on" aria-expanded="true">
                  <span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>

                </span>
                <ul class="sub-menu">
                  <li id="menu-item-2082" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2082">
                    <a href="http://localhost/wordpress/asd/">Rural</a>
                    <span class="dropdown-toggle toggled-on" aria-expanded="true">
                      <span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>

                    </span>
                    <ul class="sub-menu">
                      <li id="menu-item-2081" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2081">
                        <a href="http://localhost/wordpress/services/">Electrical</a>
                        <span class="dropdown-toggle" aria-expanded="false">
                          <span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
                        </span>
                        <ul class="sub-menu">
                          <li id="menu-item-2079" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2079">
                            <a href="http://localhost/wordpress/gallery/">Residential</a>
                            <span class="dropdown-toggle" aria-expanded="false">
                              <span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
                            </span>
                            <ul class="sub-menu">
                              <li id="menu-item-2083" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2083"><a href="http://localhost/wordpress/news-updates/">News Updates</a></li>
                            </ul>
                          </li>
                        </ul>
                      </li>
                    </ul>
                  </li>
                </ul>
              </li>
              <li><a href="#"> asdasd</a></li>
              <li><a href="#"> asdasd</a></li>
              <li><a href="#"> asdasd</a></li>
            </ul>
          </li>
          <li id="menu-item-2084" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2084">
            <a href="http://localhost/wordpress/asd/">Projects</a>
          </li>
          <li id="menu-item-2045" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2045">
            <a href="http://localhost/wordpress/blog/">Blog</a>
            <span class="dropdown-toggle" aria-expanded="false">
              <span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
            </span>
            <ul class="sub-menu">
              <li id="menu-item-2078" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-has-children menu-item-2078">
                <a href="http://localhost/wordpress/news-updates/">About</a>
                <span class="dropdown-toggle" aria-expanded="false">
                  <span class="dropdown-symbol"><i class="fa fa-caret-down" aria-hidden="true"></i></span>
                </span>
                <ul class="sub-menu">
                  <li id="menu-item-2099" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-2099">
                    <a href="http://localhost/wordpress/news-updates/">News Updates</a>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
        </ul>
      </div>    
    </nav><!-- #site-navigation -->
    <link rel="stylesheet" type="text/css" href="style.css">
</header>
  <script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous"></script>
<script src="script.js"></script>
</body>
</html>

关于javascript - 哪个事件用于下拉菜单 - 悬停时子菜单关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48218686/

相关文章:

jquery - 在动画滚动期间将拖动的 div 传输到其他连接的可排序对象

javascript - 定时器从 h1 传递到 h6

css - 垂直对齐 2 个并排自动宽度 DIV 的内容

javascript - 使用 var id 获取图像位置

javascript - 获取图像文件的数量并在它们之间切换

javascript - 显示和隐藏元素 (jquery/javascript)

javascript - 通过 JavaScript 将表格插入 div

javascript - 'jwplayer player 5.2 pro' 播放器 Action

javascript - 在点击链接之前,点击处理程序是否总是完全执行?

javascript - 从另一个 Ajax 调用 Ajax