当前位置: 首页 > 知识库问答 >
问题:

如果在弹出窗口外单击,请关闭弹出窗口

程和煦
2023-03-14

我有这段代码显示了一个按钮谁显示一个弹出窗口,我希望用户能够关闭弹出窗口点击它的外部时,它是打开的。

    /* Clean up the URL from '#popup1' in the end */
    history.replaceState(null, null, ' ');
    

    /* Take off the popup from DOM before clicking in case user refresh*/
    let id_popup = document.querySelector('#popup1');
    let popup = id_popup.parentNode
    popup.removeChild(id_popup);

    

    /*Opening the popup*/
    function Open() {
      popup.appendChild(id_popup);
      
      let class_popup = document.querySelector('.popup');
      window.addEventListener('click', function (e) {

        if (!class_popup.contains(e.target)) {
          alert('You\'re clicking outside the popup !') 
        }
      });
    }


    /*Closing the popup*/
    function Close() {
      popup.removeChild(id_popup);
      history.replaceState(null, null, ' ');
    }
css prettyprint-override">  .button {
    font-size: 1em;
    padding: 10px;
    color: #000;
    border: 2px solid #06D85F;
    border-radius: 20px/50px;
    text-decoration: none;
    cursor: pointer;
    transition: all 0.3s ease-out;
  }

  .button:hover {
    background: #06D85F;
  }

  .overlay {
    position: fixed;
    top: 0;
    bottom: 0;
    left: 0;
    right: 0;
    background: rgba(0, 0, 0, 0.7);
    transition: opacity 500ms;
    visibility: hidden;
    opacity: 0;
  }

  .overlay:target {
    visibility: visible;
    opacity: 1;
  }

  .popup {
    margin: 70px auto;
    padding: 20px;
    background: #fff;
    border-radius: 5px;
    width: 60%;
    position: relative;
    transition: all 5s ease-in-out;
  }

  .popup h2 {
    margin-top: 0;
    color: #333;
    font-family: Tahoma, Arial, sans-serif;
  }

  .popup .close {
    position: absolute;
    top: 20px;
    right: 30px;
    transition: all 200ms;
    font-size: 30px;
    font-weight: bold;
    text-decoration: none;
    color: #333;
  }

  .popup .close:hover {
    color: #06D85F;
  }

  .popup .content {
    max-height: 30%;
    overflow: auto;
  }

  @media screen and (max-width: 700px) {
    .box {
      width: 70%;
    }

    .popup {
      width: 70%;
    }
  }
<a class="button" href="#popup1" onclick="Open()">Let me Pop up</a>

</div>
<title>hi</title>
<div id="popup1" class="overlay">
  <div class="popup">
    <h2>Title</h2>
    <a class="close" onclick="Close()" href="javascript://">&times;</a>
    <div class="content">
      Text

    </div>
  </div>

共有1个答案

彭衡
2023-03-14

尝试以下操作:

let allElems = document.querySelectorAll("body > div:not(#popup1)"); // Special query selector to get everything except .popup and its children

Array.from(allElems).forEach(elem => // Convert to iterable (with Array.from) and loop through all elements selected
  elem.addEventListener('click', function (e) { // Give them all the click event listener.
    alert('You\'re clicking outside the popup !') 
  });
}

问题主要出在if语句上,因为.contains有点搞砸了事情。另一种方法是将两个元素都转换为字符串,并以这种方式比较它们,但这种方法更好,也更快(稍微),因为我们不需要检查每一次单击是否在框中。

 类似资料:
  • 我正在尝试创建一个 Angular 4 自定义表单控件作为我的日期选择器。我正在使用ngx-bootstrap,到目前为止,我已经使用ngx-bootstrap的输入,日期选择器和弹出框组件设置了这个自定义表单控件。自定义控件打开一个焦点为日期选取器的弹出窗口,但是,我需要能够通过与弹出框内容交互来更改日期,并且在我不与弹出框或输入交互时它应该关闭。我试图跟踪ngx-bootstrap githu

  • 所以我只是想知道是否有人知道在JavaFX 8中关闭弹出窗口的正确方法。例如,如果我的弹出窗口上有一个取消按钮,当按下取消按钮时,我应该使用什么方法来摆脱弹出窗口?我目前只是使用隐藏()方法。这让我有点害怕,因为我不确定弹出窗口是否在后台某处徘徊并且仍然需要关闭。但是,当我在这里查看java文档时,我没有看到任何关闭()方法,我也没有在我的IDE自动完成中看到关闭()方法。不过,我确实在文档中看到

  • 问题内容: 我通过window.open打开了一个弹出窗口。使用JavaScript打开,我想在关闭此弹出窗口时刷新父页面。(onclose事件?)我该怎么办? 问题答案: 您可以使用“ window.opener”访问父窗口,因此,在子窗口中编写如下内容:

  • 完成表单并点击注册按钮后,我得到一个弹出的信息消息(模态),消息中有close(X)和OK按钮和标题:在ABC Project下,显示了以下内容&通知用户注册成功的文本。 我尝试了几种方法来点击这个弹出窗口中的OK按钮,但都没有成功: 附加提示: null 我很感激你给我的提示和支持谢谢

  • 我有问题,点击链接从弹出窗口。单击按钮后,弹出窗口显示约3秒: 我正试图通过单击“取消” 和 但是链接没有被点击。我不知道如何断言工作在这个弹出

  • 问题内容: 我想使用Firefox浏览器,使用RSelenium从网站下载文件。我正确地完成了所有操作(导航,选择正确的元素并写下我想要的内容);现在,我单击“下载”按钮,然后打开一个Firefox弹出窗口,并询问我是否要下载文件或“用…打开”。 不幸的是,由于隐私限制,我无法编写示例。 我的问题是:如何在需要时切换到弹出窗口/警报并单击“确定”? 我尝试了以下方法,但均未成功: 我也试过了 但是