在纯 JavaScript 中单击外部 div 以隐藏 div

IT技术 javascript
2021-03-10 02:56:03

我想制作一个弹出窗口,该弹出窗口应在单击按钮后出现,并在用户单击框外时消失。

当我在它外面单击时,我不确定如何使 div 消失。

var popbox = document.getElementById("popbox");

document.getElementById("linkbox").onclick = function () {
    popbox.style.display = "block";
};

???.onclick = function () {
    popbox.style.display = "none";
};
6个回答

这是第二个版本,它有一个透明的覆盖层,正如提问者在评论中所问的那样......

window.onload = function(){
	var popup = document.getElementById('popup');
    var overlay = document.getElementById('backgroundOverlay');
    var openButton = document.getElementById('openOverlay');
    document.onclick = function(e){
        if(e.target.id == 'backgroundOverlay'){
            popup.style.display = 'none';
            overlay.style.display = 'none';
        }
        if(e.target === openButton){
         	popup.style.display = 'block';
            overlay.style.display = 'block';
        }
    };
};
#backgroundOverlay{
    background-color:transparent;
    position:fixed;
    top:0;
    left:0;
    right:0;
    bottom:0;
    display:block;
}
#popup{
    background-color:#fff;
    border:1px solid #000;
    width:80vw;
    height:80vh;
    position:absolute;
    margin-left:10vw;
    margin-right:10vw;
    margin-top:10vh;
    margin-bottom:10vh;
    z-index:500;
}
<div id="popup">This is some text.<input type="button" id="theButton" value="This is a button"></div>
    <div id="backgroundOverlay"></div>
    <input type="button" id="openOverlay" value="open popup">

这是第一个版本...

这是一些代码。如果还有什么要补充的,请告诉我:)

事件 (e) 对象允许访问有关事件的信息。e.target 为您提供触发事件的元素。

window.onload = function(){
  var divToHide = document.getElementById('divToHide');
  document.onclick = function(e){
    if(e.target.id !== 'divToHide'){
      //element clicked wasn't the div; hide the div
      divToHide.style.display = 'none';
    }
  };
};
<div id="divToHide">Click outside of this div to hide it.</div>

这是一个很好的答案,只是要补充一点,您希望将 css 设置为#popup * { pointer-events:none }好像用户可以在弹出窗口中单击没有任何相关内容。否则,如果单击框中的某个元素,则 ID 将不匹配(将返回子项的 ID)并且脚本将假定您单击了框外。
2021-04-20 02:56:03
大卫就是这样发生的......弹出窗口中有相关的内容。
2021-04-26 02:56:03
指针事件的问题在于,如果您有一个按钮或另一个需要能够被点击的元素,它将无法工作。就像@David Li 所说的那样。
2021-04-27 02:56:03
好的,所以我知道您正在创建一个模态弹出窗口。现在我明白了。谢谢你。
2021-04-30 02:56:03
事情是我正在创建一个弹出框: document.getElementById("linkbox").onclick = function () { popbox.style.display = "block"; }; 一旦用户在框外单击,我想隐藏它。所以我需要代码来使框在点击后出现并在外部点击后消失。
2021-05-12 02:56:03

这是我用来在外部单击时关闭侧边栏的代码

function openNav() {
    document.getElementById("mySidebar").style.width = "100px";
    document.getElementById("curtain_menu").style.marginLeft = "100px";
}

function closeNav() {
    document.getElementById("mySidebar").style.width = "0";
    document.getElementById("curtain_menu").style.marginLeft = "0";
}

document.onclick = function (e) {
    if (e.target.id !== 'mySidebar' && e.target.id !== 'btn_frontpage_menu') {
        if (e.target.offsetParent && e.target.offsetParent.id !== 'mySidebar')
            closeNav()
    }
}
.sidebar {
  font-family: sans-serif;
  height: 50%;
  width: 0;
  position: fixed;
  z-index: 1;
  top: 0;
  left: 0;
  background-color: #111;
  overflow-x: hidden;
  transition: 0.5s;
  padding-top: 60px;
  opacity: 0.9;
}

.sidebar a,
.dropdown-btn {
  padding: 8px 8px 8px 32px;
  text-decoration: none;
  font-size: 1vw !important;
  color: rgb(195, 195, 195);
  display: block;
  background: none;
  width: 100%;
  text-align: left;
  cursor: pointer;
  outline: none;
  transition: 0.3s;
  border: none;
}

.dropdown-container a {
  color: rgb(174, 174, 174) !important;
}

.sidebar a:hover,
.dropdown-btn:hover,
.dropdown-container a:hover {
  color: green !important;
  /* background-color: #5c5c5c; */
}

.sidebar .closebtn {
  position: absolute;
  top: 12px;
  font-size: 36px !important;
  margin-right: 5px;
  text-align: right;
  right: 20px;
}

.openbtn {
  font-size: 20px !important;
  cursor: pointer;
  background-color: transparent;
  color: black;
  padding: 6px 15px;
  border: none;
  float: left;
}

#main {
  position :absolute;
  width: 100%;
  height: 100%;
  left: 100px
}
<div id="mySidebar" class="sidebar" style="width: 100px;">
    <a href="javascript:void(0)" class="closebtn"
        onclick="closeNav()">×</a>
    <a href="">Home</a>
    <div class="dropdown-container">
        <a href="">Job Management</a>
        <a href="#">Request</a>
        <a href="#">Pending</a>
    </div>
</div>
<div id="curtain_menu">
    <button id="btn_frontpage_menu" class="openbtn" onclick="openNav()">☰</button>
    <div id="datetime"></div>
</div>
<div id="main"> Outside of 'Side Bar' is here
</div>

这是我的解决方案。

yourFunc=e=>{
  var popbox = document.getElementById("popbox");
  if(e.target.id !=="popbox"){
    popbox.style.display = "none";
    }else{
    popbox.style.display = "block";
    }
}


document.addEventListener("click",yourFunc)
欢迎使用 StackOverflow!编辑您的答案以包括对您的代码的解释,说明您为什么以这种方式编写它以及它与其他答案的比较。这将增加您的答案的实用性,并使其更有可能被点赞。
2021-05-13 02:56:03

希望这对你有用

 <script>
// Get the element
var modal = document.getElementById('modal');

// When the user clicks anywhere outside of the modal, close it
window.onclick = function(event) {
  if (event.target == modal) {
    modal.style.display = "none";
  }
}
</script>

这段代码已经过测试,运行良好,谢谢。

你不是说,event.target !== modal
2021-05-08 02:56:03

可以用onblur事件来完成

// required for focus
divEl.setAttribute('tabindex', '1');
divEl.onblur = event => {
  // hide only if blur occurred outside divEl, ignore its children
  if (!event.currentTarget.contains(event.relatedTarget)) {
    hide();
  }

  // re-focus, if a child took it
  divEl.focus();    
};
divEl.focus();

PS 对于 IE11,event.relatedTarget = event.relatedTarget || document.activeElement;可能需要一个小技巧