javascript - 如何创建自定义模式弹出窗口 - 以及如何在其外部单击关闭它

标签 javascript

<分区>

<a href="javascript:void(0)" onclick = "document.getElementById('light3').style.display='block';document.getElementById('fade').style.display='block'"><button type="button" name="" value="" id="readmorelink3">+<span class="rmore">Read More</span></button></a>

我正在使用上面的 DOM 经典 onClick 将 div 简单地显示为一个简单的弹出窗口。我在 div 中创建了一个关闭按钮,但我也希望在用户单击 body 或任何不是打开的 div 时打开 div hide。我已经尝试了一切——

我的简单叠加层(第 1 个,共 3 个)

<!-- read more overlays 1 -->

<div id="light" class="white_content">

<a class="close" href="javascript:void(0)" onclick = "document.getElementById('light').style.display='none';document.getElementById('fade').style.display='none'" class="textright" style="color: #DDD !important; float:right;">CLOSE X</a>

<h4>[Hey+]</h4>
<h3>Demo</h3>
<h3>SUP</h3>
<span> 2.5 fl. oz.</span><br>
<br>
<p>
Cool content, about cool things.
</p>

</div>

<!-- // read more overlays 1-->

我试过这个人:

$(document).click(function() {
    $('#mydiv').fadeOut(300);
});

我惹上了这个人:

 if($('#mydiv').is(":not(:visible)") ){

//如果可见等反之亦然


也试过了。

 // To prevent hide #menu when click on #main
    $('#mydiv').click(function (e) {
        e.stopPropagation();
});

 // Click outsite of #menu
    $('html').click(function () {
    $('#mydiv').hide();
});

意识到我应该用简单的 jQuery 而不是内联来完成这个;但我不想重做所有事情,所以寻求 DOM/JavaScript 解决方案。只需关闭打开或显示:阻止 div > 当它们显示时,通过另外单击元素外部或 body 标签。

EG:显示 DIV 覆盖 > 在元素外部单击并关闭。我在 BODY 标签上添加了点击关闭按钮,但它完全关闭了弹出窗口,添加了一个包装器,没有雪茄。

最佳答案

查看此答案:Close/hide an element when clicking outside of it (but not inside)

  • 使用 EventTarget.addEventListener() 将所需的事件监听器(如 “click”)分配给 documentwindow
  • 使用Event.target结合Element.closest()作为否定 ! - 为了检查 Event.target(启动事件的元素) - 它的自身或最近的祖先是否有特定的选择器。
  • 要控制元素可见性,请创建一个执行必要样式的 CSS 类,并使用 Element.classlist添加、删除或切换该类(根据需要)。

模态示例:

// DOM utility functions:
const el = (sel, par) => (par ||document).querySelector(sel);
const els = (sel, par) => (par ||document).querySelectorAll(sel);


// Task: modal:
const toggleModal = (evt) => {
  const sel = evt.currentTarget.dataset.modal;
  if (!sel) evt.currentTarget.closest(".Modal").classList.remove("is-open");
  el(sel).classList.add("is-open")
};

els("[data-modal]").forEach(elModalButton => {
  elModalButton.addEventListener("click", toggleModal);
});

addEventListener("click", (evt) => {
  // if click on button or inside modal — do nothing
  if (evt.target.closest("[data-modal]") || evt.target.closest('.Modal')) return;
  // else — close any open modal:
  els(".Modal.is-open").forEach(elModalOpen => {
    elModalOpen.classList.remove("is-open");
  });
});
/* MODAL */

.Modal {
  position: fixed;
  z-index: 99999;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  min-width: 200px;
  padding: 2em;
  background: gold;
  
  /*Hide modal by default */
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
  transition: 0.4s;
}

.Modal.is-open {
  background: red !important;
  pointer-events: auto;
  visibility: visible;
  opacity: 1;
}
<button data-modal="#modal_1" type="button">Call modal 1</button>
<button data-modal="#modal_2" type="button">Call modal 2</button>


<div class="Modal" id="modal_1">
  <h2>Modal 1 title</h2>
  <p>Pop 1 description...</p>
  <button type="button" data-modal>OK</button>
</div>

<div class="Modal" id="modal_2">
  <h2>Modal 2 title</h2>
  <p>Pop 2 description...</p>
  <button type="button" data-modal>OK</button>
</div>

关于javascript - 如何创建自定义模式弹出窗口 - 以及如何在其外部单击关闭它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23283652/

相关文章:

javascript - tinyMCE 空验证检查

javascript - JavaScript 执行后检查 DOM 是否处于稳定状态(无事件回流/重绘)

javascript - 由于获取结果未定义而获得响应时出现问题

javascript - 控制回调流程

javascript - hammer.js - 阻止拖动事件直到上一个事件结束

javascript - 将 Blob 传递给新音频

javascript - 无法弄清楚我在 JavaScript 中的 if 语句有什么问题 [9 月 1 日更新 看来我的 for 循环运行了两次,我该如何解决?]

javascript - 如何放置多个边缘动画组合?

javascript - 为什么使用||时 'Unexpected "."'括号中默认值的运算符

javascript - Node.js Stream Transform 是否维护 block 的顺序?