【问题标题】:Click off menu/div to close点击关闭菜单/div关闭
【发布时间】:2015-04-02 12:08:59
【问题描述】:

当我单击页面上除菜单内以外的任何位置时,我一直在尝试关闭菜单。

当在菜单中单击链接时,我设法实现了这一点,方法是为其提供与菜单按钮相同的 onclick 功能,但我没有成功单击菜单以关闭它。

http://codepen.io/anon/pen/LEvdmW

JS

function setVisibility(id) {
  var targetButton;
  switch( id ) {
    case "layer":
      targetButton = "button";
      break;
  }
  if (document.getElementById(targetButton).value == 'Close') {
    document.getElementById(targetButton).innerHTML = 'Open';
    document.getElementById(targetButton).value = 'Open';
    document.getElementById(id).style.display = 'none';
  } else {
    document.getElementById(targetButton).innerHTML = 'Close';
    document.getElementById(targetButton).value = 'Close';
    document.getElementById(id).style.display = 'inline';
  }
}

HTML

<button name="type" id="button" onclick="setVisibility('layer')">Open</button>
<div id="layer"><a onclick="setVisibility('layer')"> Hello</div>

CSS

#layer {
    position: absolute;
    left: 8px;
    top: 50px;
    background-color: #989898;
    width: 280px;
    height: 100px;
    padding: 10px;
    color: black;
    display: none;
}


button {  border:none; background:#989898; color:#fff; padding:10px; outline:none; cursor:pointer;

}

【问题讨论】:

  • 您是否仅限于使用 javascript 解决方案,或者您可以使用 jQuery?
  • jquery 也是,抱歉我忘记添加了。

标签: javascript jquery


【解决方案1】:

可以通过以下代码实现。

$(document).mouseup(function (e)
{
    var container = $("YOUR CONTAINER SELECTOR");

    if (!container.is(e.target) // if the target of the click isn't the container...
        && container.has(e.target).length === 0) // ... nor a descendant of the container
    {
        container.hide();
    }
});

工作小提琴:http://jsfiddle.net/LCB5W/153/

更新小提琴:http://jsfiddle.net/LCB5W/154/

【讨论】:

  • 会做,只是尝试将它实现到我现有的代码中,目前让它工作有点麻烦。不过你的小提琴效果很好
  • 我只是无法让它与我的代码一起使用@Jitendra 我可能误解了一些非常简单的事情
  • 将您的菜单 html 放在问题中。
  • 我现在已经添加了@Jitendra
  • 谢谢,我按照您的评论添加了#layer,但是当我测试它时,我一定是在复制/粘贴中弄乱了它,因为它不起作用。你的小提琴可以。太棒了
【解决方案2】:

您可以在 div 后面有一个背景,您可以在其中设置 onclick 事件来隐藏 div。检查下面的修改代码(修改你的代码让你理解):

工作示例:DEMO HERE

HTML

<button name="type" id="button" onclick="setVisibility('layer')">Open</button>
<div id="backdrop" onclick="setVisibility('layer')"></div>
<div id="layer">Hello</div>

CSS

#layer {
    position: absolute;
    left: 8px;
    top: 50px;
    background-color: white;
    width: 280px;
    height: 100px;
    padding: 10px;
    color: black;
    display: none;
    z-index : 999;
}

#backdrop {
    position : absolute;
    top : 0;
    left : 0;
    width : 100%;
    height : 100%;
    background : black;
    opacity : 0.5;
    z-index : 2;
    display : none;
}

button {  
    border:none; 
    background:#989898; 
    color:#fff; 
    padding:10px; 
    outline:none; 
    cursor:pointer;
}

JS

function setVisibility(id) {
  var targetButton;
  switch( id ) {
    case "layer":
      targetButton = "button";
      break;
  }
  if (document.getElementById(targetButton).value == 'Close') {

    document.getElementById(targetButton).innerHTML = 'Open';
    document.getElementById(targetButton).value = 'Open';
    document.getElementById(id).style.display = 'none';
    document.getElementById("backdrop").style.display = "none"; 

  } else {

    document.getElementById("backdrop").style.display = "block"; 
    document.getElementById(targetButton).innerHTML = 'Close';
    document.getElementById(targetButton).value = 'Close';
    document.getElementById(id).style.display = 'inline';

  }
}

【讨论】:

  • 谢谢,我遇到的问题是后面的图层吸收了点击。因此,如果我点击关闭并打开一个链接,我必须点击两次。一次关闭菜单,第二次点击页面上的链接。
  • 我不这么认为..你试过吗..?出于同样的原因,我正在使用 z-index...backdrop 将保留在 div 后面
  • 你的意思是说如果页面上有任何链接,即使是在 div 之外,你应该能够点击它,同时你的 div 也应该隐藏..?
  • 它更像是弹出窗口而不是菜单。
猜你喜欢
  • 2016-09-24
  • 1970-01-01
  • 2019-06-22
  • 1970-01-01
  • 2017-07-01
  • 2018-10-18
  • 1970-01-01
相关资源
最近更新 更多