javascript - 为什么我在外面点击时我的 js modal 没有关闭?
问题描述
我正在尝试创建一个照片库,可以在其中单击图片以显示描述图片的模式。关闭按钮有效,但是,我需要能够在背景上单击外部以关闭模式。我有以下代码:
function stylemodals() {
var modalarray = document.body.getElementsByClassName("modal");
for (var i = 0; i < modalarray.length; i++) {
modalarray[i].setAttribute("style", "display: none; position: fixed; z-index: 1; left: 0; top: 0; width: 100%; height: 100%; color:black; overflow: auto; background-color: rgba(0, 0, 0, .4);");
}
}
stylemodals();
function stylemodalcontent() {
var modalcontentarray =
document.body.getElementsByClassName("modal-content");
for (var i = 0; i < modalcontentarray.length; i++) {
modalcontentarray[i].setAttribute("style", "background-color: #FFFFFF; margin: 15 % auto; border: 1 px solid #888;width: 70%;");
}
}
stylemodalcontent();
//set 1
var mdl1 = document.getElementById('mdl1');
var btn1 = document.getElementById("btn1");
var close1 = document.getElementById("close1");
btn1.onclick = function() {
mdl1.style.display = "block";
};
close1.onclick = function() {
mdl1.style.display = "none";
};
window.onclick = function(event) {
if (event.target == mdl1) {
mdl1.style.display = "none";
}
};
<table>
<tr>
<td>
<!-- Trigger/Open The Modal NEEDS AN IMAGE -->
<input type="image" src="" alt="ib-image" id="btn1">
<!-- The Modal -->
<div id="mdl1" class="modal">
<!-- Modal content NEEDS CONTENT-->
<div class="modal-content">
<span id="close1" style="color: rgb(31, 31, 31); float: right;
font-size: 28px; font-weight: bold;">×</span>
<p>CONTENT</p>
</div>
</div>
</td>
</tr>
</table>
我一直在研究如何做到这一点,我从 w3schools 复制并粘贴了它,然后根据我的需要对其进行了修改,但我仍然无法在模式之外单击以关闭。我该怎么做呢?
- 编辑 -
这是新代码:
var modal = document.getElementById("modal");
modal.setAttribute("style", "display: none; position: fixed; z-index: 1; left: 0; top: 0; width: 100%; height: 100%; color: black; overflow: auto; background-color: rgba(0, 0, 0, .4); ");
document.getElementById("modal-content").setAttribute("style", "background-color: #FFFFFF; margin: 15% auto; border: 1px solid #888; width: 70%;");
var actualmodalcontent = document.getElementById("actual-modal-content");
function modal1 (){
actualmodalcontent.innerHTML = "CONTENT1"
modal.style.display = "block";
};
var close = document.getElementById("close");
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = "none";
}
if (event.target == close) {
modal.style.display = "none";
}
};
<div id="modal">
<div id="modal-content">
<span id="close" onclick="close()" style="color: rgb(31, 31, 31); float: right; font-size: 28px; font-weight: bold;">×</span>
<p id="actual-modal-content">
CONTENT0
</p>
</div>
</div>
<input type="image" src="" alt="ib-image" id="btn1" onclick="modal1()">
解决方案
window.onclick = function(event) {
if (event.target == mdl1) {
mdl1.style.display = "none";
}
};
如果一个人完全点击模态框,而不是在它之外,那部分代码会将模态框显示设置为无。因此,您需要使用event.target !== mdl1 && !mdl1.contains( event.target )
来检测页面上任何不是模态本身或其任何子元素的元素的点击。https://developer.mozilla.org/en-US/docs/Web/API/Node/contains
请记住,您可能只想在模态实际打开后将关闭处理程序添加到窗口,然后在模态关闭后将其删除。这样,您可以防止您的页面为甚至可能未呈现的模式触发多个 onclick 事件。
推荐阅读
- android - Jenkins Android 构建未创建获取操作不允许错误
- python - 如何找到包含两个部分的 geojson 多边形的区域,例如一个离海岸有一个岛屿的县?
- python - 使用 django 框架从 sqlitedb 切换到 PostgreSQL 后创建了模式但没有数据存在
- reactjs - 如何在 Next.js 中使用组件作为路由?
- flutter - 我如何使用 logging 包来收集 Flutter 错误?
- typescript - 使用 TypeScript 设置 HTMLElement
- flutter - 致命错误:找不到在 MabookBook M1 上运行的“Flutter/Flutter.h”文件
- ms-access - 将组合框中的值记录到特定表字段
- entity-relationship - ER 图 - 如何为与属性的递归关系编写模式
- flutter - 如何在从构造函数输入初始化其值而不更改构造函数输入值的情况下修改状态类中的局部变量?