2017-07-31 110 views
0

我試圖用以下功能實現兩個非常簡單的彈出窗口/模式 - 1.單擊一個按鈕將打開相應的彈出窗口。 2.一旦彈出窗口處於活動狀態,單擊屏幕上的任意位置將關閉彈出窗口。 3.點擊「X」將關閉彈出窗口。javascript中關閉邏輯的彈出窗口/模式

我能夠實現點1和2。然而提到的目標,我無法實現點3

HTML -

<button id="myBtn1">Open Modal 1</button> 
<div id="myModal1" class="modal"> 
    <div class="modal-content"> 
    <span class="close">&times;</span> 
    <p>Some text in first Modal</p> 
    </div> 
</div> 


<button id="myBtn2">Open Modal 2</button> 
<div id="myModal2" class="modal"> 
    <div class="modal-content"> 
    <span class="close">&times;</span> 
    <p>Some text in second modal</p> 
    </div> 
</div> 

JS - 這顯然是不正確的:

var modal1 = document.getElementById('myModal1'); 
var btn1 = document.getElementById("myBtn1"); 

var modal2 = document.getElementById('myModal2'); 
var btn2 = document.getElementById("myBtn2"); 

var span = document.getElementsByClassName("close")[0]; 

btn1.onclick = function() { 
    modal1.style.display = "block"; 
} 

btn2.onclick = function() { 
    modal2.style.display = "block"; 
} 


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

span.onclick = function() { 
    modal1.style.display = "none"; 
} 

請在這裏找到我的代碼 - https://jsfiddle.net/23bL2w9L/

注意 - 我無法以任何方式更改HTML代碼。只有Javascript應該被修改。

在此先感謝

回答

1

你只爲第一模跨度Close。我已經動態地修改了你的代碼來關閉模態窗口。如果你有10模式關閉按鈕,這將工作沒有任何修改。

更改

var span = document.getElementsByClassName("close")[0]; 

var span = document.querySelectorAll(".close"); //this will get all `.close` elements 

更改,

span.onclick = function() { 
    modal1.style.display = "none"; 
} 

for(var i = 0; i < span.length; i++){ 
    span[i].onclick = function() { 
     //modal1.style.display = "none"; 
     //console.log(this.closest('.modal')); 
     this.closest('.modal').style.display = "none"; 
    } 
} 

https://jsfiddle.net/23bL2w9L/5/

演示:

var modal1 = document.getElementById('myModal1'); 
 
var btn1 = document.getElementById("myBtn1"); 
 

 
var modal2 = document.getElementById('myModal2'); 
 
var btn2 = document.getElementById("myBtn2"); 
 

 
var span = document.querySelectorAll(".close"); 
 

 
btn1.onclick = function() { 
 
    modal1.style.display = "block"; 
 
} 
 

 
btn2.onclick = function() { 
 
    modal2.style.display = "block"; 
 
} 
 

 

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

 
for(var i = 0; i < span.length; i++){ 
 
    span[i].onclick = function() { 
 
    //modal1.style.display = "none"; 
 
    console.log(this.closest('.modal')); 
 
    this.closest('.modal').style.display = "none"; 
 
    } 
 
}
/* The Modal (background) */ 
 
.modal { 
 
    display: none; /* Hidden by default */ 
 
    position: fixed; /* Stay in place */ 
 
    z-index: 1; /* Sit on top */ 
 
    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/Box */ 
 
.modal-content { 
 
    background-color: #fefefe; 
 
    margin: 15% auto; /* 15% from the top and centered */ 
 
    padding: 20px; 
 
    border: 1px solid #888; 
 
    width: 80%; /* Could be more or less, depending on screen size */ 
 
} 
 

 
/* The Close Button */ 
 
.close { 
 
    color: #aaa; 
 
    float: right; 
 
    font-size: 28px; 
 
    font-weight: bold; 
 
} 
 

 
.close:hover, 
 
.close:focus { 
 
    color: black; 
 
    text-decoration: none; 
 
    cursor: pointer; 
 
}
<!-- Trigger/Open The Modal --> 
 
<button id="myBtn1">Open Modal 1</button> 
 

 
<!-- The Modal --> 
 
<div id="myModal1" class="modal"> 
 

 
    <!-- Modal content --> 
 
    <div class="modal-content"> 
 
    <span class="close">&times;</span> 
 
    <p>Some text in first Modal</p> 
 
    </div> 
 

 
</div> 
 

 

 

 

 
<!-- Trigger/Open The Modal --> 
 
<button id="myBtn2">Open Modal 2</button> 
 

 
<!-- The Modal --> 
 
<div id="myModal2" class="modal"> 
 

 
    <!-- Modal content --> 
 
    <div class="modal-content"> 
 
    <span class="close">&times;</span> 
 
    <p>Some text in second modal</p> 
 
    </div> 
 

 
</div>

+0

只是要小心,不能過度使用'querySelectorAll'比'getElementsByClassName'方法要慢 –

1

你幾乎已經擁有了它。

你可以得到每個模式的關閉按鈕,這樣

var span1 = modal1.getElementsByClassName("close")[0]; 

,並綁定點擊按鈕,這樣

span1.onclick = function() { 
    modal1.style.display = "none"; 
} 

https://jsfiddle.net/YannBertrand/23bL2w9L/1/

0

它的工作爲modal1,和爲第二個模態(modal2)這樣做,請添加:

var span2 = document.getElementsByClassName("close")[1]; 
span2.onclick = function() { 
    modal2.style.display = "none"; 
} 

工作小提琴:Here

0

當我嘗試你的小提琴代碼,modal1的按鈕關閉可以工作,但不適合modal2。 在您的JS代碼,您只創建modal1行動,你必須爲modal2太創建一個動作......

var modal1 = document.getElementById('myModal1'); 
var btn1 = document.getElementById("myBtn1"); 

var modal2 = document.getElementById('myModal2'); 
var btn2 = document.getElementById("myBtn2"); 

var span = document.getElementsByClassName("close")[0]; 
var span2 = document.getElementsByClassName("close")[1]; 

btn1.onclick = function() { 
    modal1.style.display = "block"; 
} 

btn2.onclick = function() { 
    modal2.style.display = "block"; 
} 


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

span.onclick = function() { 
    modal1.style.display = "none"; 
} 

span2.onclick = function() { 
    modal2.style.display = "none"; 
}