javascript - 单击菜单图标时不会打开下拉菜单,但当我单击离它有点远时会打开

标签 javascript html css

下拉点击菜单图标后不打开

我正在制作一个酒店管理网站,其中我在导航栏中有三个列表项,其中之一是下拉菜单图标。问题是这个菜单图标在点击它时不会打开,但如果我单击离它有点远。不知道这背后的错误是什么,现在已经尝试纠正这个问题几个小时了。任何形式的帮助都会很棒。谢谢。

var myIndex = 0;
carousel();

function carousel() {
  var i;
  var x = document.getElementsByClassName("mySlides");
  for (i = 0; i < x.length; i++) {
    x[i].style.display = "none";
  }
  myIndex++;
  if (myIndex > x.length) {
    myIndex = 1
  }
  x[myIndex - 1].style.display = "block";
  setTimeout(carousel, 3000);
} 
        function myFunction() {
            document.getElementById("myDropdown").classList.toggle("show");
        }
        
        // Close the dropdown if the user clicks outside of it
window.onclick = function(e) {
  if (!e.target.matches('.dropbtn')) {

    var dropdowns = document.getElementsByClassName("dropdown-content");
    for (var d = 0; d < dropdowns.length; d++) {
      var openDropdown = dropdowns[d];
      if (openDropdown.classList.contains('show')) {
        openDropdown.classList.remove('show');
      }
    }
  }
}
.slider img {
  width: 60%;
  height: 24%;
  margin-left: 20%;
  margin-top: 1%;
}
.slider {
  background-color: black;
}
ul li img {
  max-height: 40px;
}
.login_pic {
  height: 20px;
}
.wrapper {
  list-style-type: none;
  max-width: 1600px;
  margin-left: 20%;
}
li {
  float: left;
}
li a {
  display: inline-block;
  color: black;
  text-decoration: none;
  width: 40px;
  padding: 0 2%;
}
li.dropdown {
  display: inline-block;
}
.dropdown-content {
  display: none;
  background-color: green;
  position: absolute;
  min-width: 160px;
  float: none;
}
.dropdown-content a {
  color: white;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
  text-align: left;
  float: none;
}
.dropdown-content a:hover {
  background-color: black;
  padding-right: 40px;
}
.show {
  display: block;
}
.dropbtn img {
  margin-top: 12px;
  margin-left: 7px;
  max-height: 30px;
  max-width: 30px;
  background-color: none;
  border: none;
  cursor: pointer;
  background-color: none;
}
.login_pic {
  margin-top: 10px;
}
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <title>Hotel Paradise</title>
  <link href='https://fonts.googleapis.com/css?family=Changa+One|Open+Sans:400,400italic,700,700italic,800' rel='stylesheet' type='text/css'>
  <link rel="Stylesheet" href="main.css">
  <link rel="Stylesheet" href="responsive.css">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">

  <body>
    <header>
      <a href="index.php" id="logo">
        <h1>Hotel Paradise</h1>
        <h5>Banquet|Restaurant|Lounge|Stay</h5>
      </a>
      <div class="wrapper">
        <nav>
          <ul>
            <li>
              <a href="index.php">
                <img src="images/home_symbol.png" title="Home" />
              </a>
            </li>
            <li>
              <a href="login_register.php">
                <img src="images/login_symbol.png" class="login_pic" title="Login" />
              </a>
            </li>
            <li class="dropdown">
              <a href="javascript:void(0)" class="dropbtn" onclick="myFunction()">
                <img src="images/drop_down.png" />
              </a>
              <div class="dropdown-content" id="myDropdown">
                <a href="stay.php">Reservation</a>
                <a href="feedback.php">Feedback</a>
                <a href="about.php">Contact Us</a>
              </div>
            </li>
          </ul>
        </nav>
        <div>
    </header>
    <div id="main">
      <p>"Welcome".</p>
    </div>
    <div class="slider">
      <img class="mySlides" src="images/homepage.jpg">
      <img class="mySlides" src="images/homepage_2.jpg">
    </div>


  </body>

</html>

最佳答案

沙瓦特,

这里的问题是,当您单击该图标时,您的 window.onclick() 函数正在撤消该次单击对 css 的更改。

下面是好案例的演练:

  • 点击图标的边缘。
  • 这会触发 a.dropbtn 元素,因此会触发 onclick() 处理程序并添加“show”类。
  • 然后该事件向上冒泡到 window.onclick 处理程序,目标匹配 .dropbtn,因此它什么都不做。

在坏的情况下:

  • 点击图片。
  • 事件对该元素不做任何事情,因此冒泡到 a.dropbtn
  • a.dropbtn 上的 onclick 处理程序被触发,显示类被添加。
  • 事件冒泡到 window.onclick。在这种情况下,目标是 img,而不是 a.dropbtn,所以 !e.target.matches('.dropbtn') 为真,显示被删除。 因此,下拉菜单的删除速度与添加速度一样快。

解决此问题的一个方法是向您的点击处理程序添加一个 event.e.stopPropagation() 调用。如下所示:

window.myFunction =     function myFunction(event) {
    document.getElementById("myDropdown").classList.toggle("show");
    event.stopPropagation();
}

// Close the dropdown if the user clicks outside of it
window.onclick = function(e) {
  if (!e.target.matches('.dropbtn')) {
    var dropdowns = document.getElementsByClassName("dropdown-content");
    for (var d = 0; d < dropdowns.length; d++) {
      var openDropdown = dropdowns[d];
      if (openDropdown.classList.contains('show')) {
        openDropdown.classList.remove('show');
      }
    }
  }
}
.wrapper {
  list-style-type: none;
  max-width: 1600px;
  margin-left: 20%;
}
li {
  float: left;
}
li a {
  display: inline-block;
  color: black;
  text-decoration: none;
  width: 40px;
  padding: 0 2%;
}
li.dropdown {
  display: inline-block;
}
.dropdown-content {
  display: none;
  background-color: green;
  position: absolute;
  min-width: 160px;
  float: none;
}
.dropdown-content a {
  color: white;
  padding: 12px 16px;
  text-decoration: none;
  display: block;
  text-align: left;
  float: none;
}
.dropdown-content a:hover {
  background-color: black;
  padding-right: 40px;
}
.show {
  display: block;
}
.dropbtn img {
  margin-top: 12px;
  margin-left: 7px;
  max-height: 30px;
  max-width: 30px;
  background-color: none;
  border: none;
  cursor: pointer;
  background-color: none;
}
<header>
  <div class="wrapper">
    <nav>
      <ul>
        <li>
          <a href="index.php">
            <img src="images/home_symbol.png" title="Home" />
          </a>
        </li>
        <li>
          <a href="login_register.php">
            <img src="images/login_symbol.png" class="login_pic" title="Login" />
          </a>
        </li>
        <li class="dropdown">
          <a href="javascript:void(0)" class="dropbtn" onclick="myFunction(event)">
            <img src="images/drop_down.png" />
          </a>
          <div class="dropdown-content" id="myDropdown">
            <a href="stay.php">Reservation</a>
            <a href="feedback.php">Feedback</a>
            <a href="about.php">Contact Us</a>
          </div>
        </li>
      </ul>
    </nav>
    </div>
</header>

(一般来说,在将来发布之前删除一些示例代码可能会很好)

这有帮助吗?

关于javascript - 单击菜单图标时不会打开下拉菜单,但当我单击离它有点远时会打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41410658/

相关文章:

javascript - JavaScript 类中使用箭头函数的继承和多态性

html - 了解全高背景图像的行为

javascript - 尝试在表格中显示数组(Javascript + html)

javascript - 验证引擎有效时返回 False

javascript - 克隆 html 表单标签后图像预览不显示

html - 设置超出其文本边界框的字体样式

jquery - 带有单选按钮和 JS 的 CSS 过渡

javascript - Bootstrap Grid 以错误的方式折叠 : elements lie on top of other elements

css - 在 Eclipse 4 中使用 CSS 设置背景颜色和背景图像

javascript - 使用父函数jquery显示类名