javascript - 如果模态数未知,多个模态将不会关闭
问题描述
我试图让下面的代码工作,但它似乎只适用于列表中的最后一个模式。
var modals = document.getElementsByClassName('modal');
var btns = document.getElementsByClassName("pop-up");
var spans=document.getElementsByClassName("close-modal");
for(let i=0;i<btns.length;i++){
btns[i].onclick = function() {
modals[i].style.display = "block";
}
}
for(let i=0;i<spans.length;i++){
spans[i].onclick = function() {
modals[i].style.display = "none";
}
}
}
// When the user clicks anywhere outside of the modal, close it
for(let i=0;i<modals.length;i++){
window.onclick = function(event) {
if (event.target == modals[i]) {
modals[i].style.display = "none";
}
}
}
}
有人可以帮助清理我哪里出错了吗?
编辑:下面是使用下面答案中描述的事件侦听的片段-此片段显示实现此事件侦听器会阻止按钮在单击时工作-我是否错误地实现了它?如果我删除 JS 中的代码以单击任何地方,那么其余的工作。
function submitBtn(){
// Get the modal
var modals = document.getElementsByClassName('modal');
// Get the button that opens the modal
var btns = document.getElementsByClassName("pop-up");
var spans=document.getElementsByClassName("close-modal");
for(let i=0;i<btns.length;i++){
btns[i].onclick = function(){
modals[i].style.display = "block";
}
}
for(let i=0;i<spans.length;i++){
spans[i].onclick = function(){
modals[i].style.display = "none";
}
}
// When the user clicks anywhere outside of the modal, close it
window.addEventListener('click', function(){
var modals = document.getElementsByClassName('modal');
for(let i = 0; i < modals.length; i++){
modals[i].style.display = "none";
}
});
}
.modal {
display: none; /* Hidden by default */
position: fixed; /* Stay in place */
z-index: 10; /* Sit on top */
padding-top: 100px; /* Location of the box */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0,0,0); /* Fallback color */
background-color: rgba(0,0,0,0.4); /* Black w/ opacity */
}
.modal-content {
background-color: #fefefe;
margin: auto;
padding: 20px;
border: 1px solid #888;
width: 80%;
display: table;
}
/* Modal Content */
.modal-content div {
padding: 5px;
margin: 5px;
}
/* The Close Button */
.close-modal {
color: #aaaaaa;
text-align: right;
font-size: 28px;
font-weight: bold;
}
.close-modal:hover,
.close-modal:focus {
color: #000;
text-decoration: none;
cursor: pointer;
}
<div class="modal">
<div class="modal-content">
stuff1<p class="close-modal">×</p>
</div>
</div>
<div class="modal">
<div class="modal-content">stuff2<p class="close-modal">×</p></div>
</div>
<span>
<button type="button" class="pop-up" onclick="submitBtn()">SEND</button></span>
<span>
<button type="button" class="pop-up" onclick="submitBtn()">SEND</button></span>
解决方案
以下是您正在寻找的内容。如前所述,您正在window
通过循环并重新创建它来覆盖您绑定的事件,但该事件只需要注册一次,如下所示。
window.addEventListener('click', function() {
var modals = document.getElementsByClassName('modal');
for (let i = 0; i < modals.length; i++) {
modals[i].style.display = "none";
}
});
推荐阅读
- node.js - nodejs .node-xmlhttprequest-sync-1 文件创建
- swift - NavigationController PushViewController 不显示
- c++ - Physx:为什么这些刚体永远不会静止?
- javascript - JavaScript中箭头函数中的“this”是什么
- c++ - c++ 类中私有属性的问题
- javascript - 具有寻路网格生成的边缘情况的困难
- cmake - cmake3 继续使用旧的 CXXFLAGS 值
- angular - Angular:如何将服务连接到 Material RankTable?
- r - 如何在具有相同列表的 R 中使用嵌套的 for 循环?
- python - 自定义损失函数不等于用于训练模型的损失函数