【问题标题】:Prevent click in dropdown container to close dropdown防止单击下拉容器以关闭下拉菜单
【发布时间】:2016-05-26 07:07:32
【问题描述】:

我需要制作在同一页面中有多个实例的单一类型的下拉列表(所以是同一个类)。每个都必须正常工作,点击展开内容,点击内部内容保持显示(包括登录/注册表单,下拉菜单,复选框等甚至空白区域),点击下拉列表之外 - 如果我点击关闭它并关闭它它的标题或其他下拉菜单。 我设法完成了我需要的大部分工作,除了当我使用复选框或输入字段时它会关闭 - 下拉内容内的任何点击都会关闭它。我看到我必须使用 e.preventDefault();但是当我尝试时,它阻止了下拉菜单打开。

我制作了一个 jsfiddle,所以你可以看到它并告诉我我做错了什么或错过了什么。

$(".dropdown").click(function(event) {
  event.stopPropagation();
  $(this).parent().find(".dropdown").not(this).find(".dropdown-values").slideUp();
  $(this).find(".dropdown-values").slideToggle();
});
$(document).click(function(event) {
  $(".dropdown-values").slideUp();
});
.dropdown-container {
  background: #ddd;
}

.dropdown {
  background: #313654;
  display: inline-block;
  border-left: 1px solid #000;
  border-right: 1px solid #3f4c6b;
  position: relative;
  cursor: pointer;
}

.dropdown:hover {
  background: blue;
  color: white;
}

.dropdown-title {
  display: block;
  padding: 5px 10px 5px 10px;
  font-size: 13px;
  font-weight: bold;
  color: #FFF;
}

.dropdown-values {
  position: absolute;
  left: 0px;
  top: 100%;
  background: #3f4c6b;
  padding: 15px;
  display: none;
}

.dropdown-values a:HOVER {
  background: #dedede;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<div class="dropdown-container">
  <div class="dropdown">
    <a class="dropdown-title">Login</a>
    <div class="dropdown-values">
      <a class="dropdown-link" href="/test1">MY STORY</a>
      <a class="dropdown-link" href="/test2">MY STYLE</a>
      <a class="dropdown-link" href="/test3">MY STYLE X</a>
      <a class="dropdown-link" href="/test4">MY STYLE Y</a>
      <form method="post" action="index.html">
        <p>
          <input type="text" name="login" value="" placeholder="Username or Email">
        </p>
        <p>
          <input type="password" name="password" value="" placeholder="Password">
        </p>
        <p class="remember_me">
          <label>
            <input type="checkbox" name="remember_me" id="remember_me"> Remember me on this computer
          </label>
        </p>
        <p class="submit">
          <input type="submit" name="commit" value="Login">
        </p>
      </form>
    </div>
  </div>
  <div class="dropdown">
    <a class="dropdown-title">Register</a>
    <div class="dropdown-values">
      <div class="dropdown-value">
        <a class="dropdown-value" href="/test5">MY PRICING</a>
      </div>
      <div class="">
        <a class="dropdown-value" href="/test6">SERVICES</a>
      </div>
    </div>
  </div>
</div>

【问题讨论】:

    标签: jquery drop-down-menu


    【解决方案1】:

    您应该只将下拉点击触发器绑定到“下拉标题”。用这个替换所有的JS部分:

    $(".dropdown-title").click(function(event) {
      $(this).siblings(".dropdown-values").slideToggle();
    });
    $(".dropdown").mouseleave(function(event) {
      $(".dropdown-values").slideToggle();
    });
    

    【讨论】:

    • 单击内部下拉菜单是可以的,但是当我单击页面上的任意位置 + 单击另一个下拉菜单时,我会失去关闭。当一个下拉菜单展开并且我点击另一个下拉菜单时,第一个必须关闭,就像我原来的 jsfiddle 中发生的那样。
    • 是的,我忘了处理那个。但请查看我编辑的 sn-ps。
    • 无法正常工作。检查我添加的新jsfiddle,所有东西都正常工作,并检查你的jquery。在您的解决方案中,当我从服务悬停到关于时,下拉菜单开始同时显示一个或两个。一旦我打开了一个并在外部(在页面中)单击以将其关闭,则什么也没有发生。拥有与我的解决方案相同的功能但使用更短(更干净)的 jquery 会很好。
    【解决方案2】:

    这是可行的解决方案 - 我在下拉列表中添加了其他表单。

      $(".dropdown").click(function(event) {
      event.stopPropagation();
      $(this).parent().find(".dropdown").not(this).find(".dropdown-values").fadeOut(500);
      $(this).parent().find(".dropdown").not(this).find(".dropdown-title").removeClass("activated");
    });
    $(document).click(function(event) {
      $(".dropdown-values").fadeOut(500);
      $(".dropdown-title").removeClass("activated");
    });
    $(".dropdown-title").click(function(event) {
      $(this).siblings(".dropdown-values").fadeToggle(500);
      $(this).parents(".dropdown").find('.dropdown-title').toggleClass("activated");
    });
     .activated {
       background: red;
     }
    .dropdown-container {
      background: #ddd;
    }
    .dropdown {
      background: #313654;
      display: inline-block;
      border-left: 1px solid #000;
      border-right: 1px solid #3f4c6b;
      position: relative;
      cursor: pointer;
    }
    .dropdown:hover {
      background: blue;
      color: white;
    }
    .dropdown-title {
      display: block;
      padding: 5px 10px 5px 10px;
      font-size: 13px;
      font-weight: bold;
      color: #FFF;
    }
    .dropdown-values {
      position: absolute;
      left: 0px;
      top: 100%;
      background: #3f4c6b;
      padding: 15px;
      display: none;
    }
    .dropdown-values a {
      display: block;
    }
    .dropdown-values a:HOVER {
      background: #dedede;
      display: block;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
    <div class="dropdown-container">
      <div class="dropdown">
        <a class="dropdown-title">ABOUT</a>
        <div class="dropdown-values">
          <select name="cars">
            <option value="volvo">Volvo</option>
            <option value="saab">Saab</option>
            <option value="fiat">Fiat</option>
            <option value="audi">Audi</option>
          </select>
          <form>
            <input type="radio" name="gender" value="male" checked>Male
            <br>
            <input type="radio" name="gender" value="female">Female
            <br>
            <input type="radio" name="gender" value="other">Other
          </form>
          <a class="dropdown-link" href="/test1">MY STORY</a>
          <a class="dropdown-link" href="/test2">MY STYLE</a>
          <a class="dropdown-link" href="/test3">MY STYLE X</a>
          <a class="dropdown-link" href="/test4">MY STYLE Y</a>
          <form method="post" action="index.html">
            <p>
              <input type="text" name="login" value="" placeholder="Username or Email">
            </p>
            <p>
              <input type="password" name="password" value="" placeholder="Password">
            </p>
            <p class="remember_me">
              <label>
                <input type="checkbox" name="remember_me" id="remember_me">Remember me on this computer
              </label>
            </p>
            <p class="submit">
              <input type="submit" name="commit" value="Login">
            </p>
          </form>
        </div>
      </div>
      <div class="dropdown">
        <a class="dropdown-title">SERVICE</a>
        <div class="dropdown-values">
          <div class="dropdown-value">
            <a class="dropdown-value" href="/test5">MY PRICING</a>
          </div>
          <div class="">
            <a class="dropdown-value" href="/test6">SERVICES</a>
          </div>
        </div>
      </div>
    </div>

    【讨论】:

      猜你喜欢
      • 2018-02-16
      • 1970-01-01
      • 2021-09-01
      • 2019-08-22
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多