仅当元素可见时才执行点击功能
2020-03-02
768
因此,我在页面顶部有一个搜索“模态框”(自己的 html + css,而不是 bootstrap)。当我单击搜索栏时,我想打开模态框。然后,当它打开时,我想通过单击“X”按钮或模态框外的任何地方使其可关闭。
打开模态框并通过按下按钮关闭它,此代码段可行:
<script type="text/javascript">
var search_box = document.querySelector('#search-box-top');
var search_box_bg = document.querySelector('#search-box-top-bg');
document.querySelectorAll('#close-search-box').forEach(el => el.addEventListener('click', function() {
search_box.style.display = 'none';
search_box_bg.style.display = 'none';
}))
document.querySelectorAll('#open-search-box').forEach(el => el.addEventListener('click', function() {
search_box.style.display = 'block';
search_box_bg.style.display = 'block';
}))
</script>
现在我有此代码来查看点击是发生在模态框内还是模态框外:
var specifiedElement = document.getElementById('search-box-top');
var search_box_visible = document.getElementById('search-box-top').style.display;
if (search_box_visible = 'none') {
document.addEventListener('click', function(event) {
var isClickInside = specifiedElement.contains(event.target);
if (isClickInside) {
console.log('You clicked inside')
}
else {
console.log('You clicked outside')
}
});
} else {
}
问题是第二个函数在模态框仍处于关闭状态时也有效,因此控制台始终记录“您点击了外面”。因此我需要当 search_box_visible = none 时 isClickInside 起作用,并且当它是块时它应该返回设置 display = 'none' 的 else 函数;
有人知道如何结合这两者或制作一个更好的函数来做到这一点吗?提前谢谢!
2个回答
您在以下语句中遇到问题
if (search_box_visible = 'none')
它应该是
if (search_box_visible == 'none')
或
if (search_box_visible === 'none')
只需检查这是否解决了问题。
Sankalp Chari
2020-03-02
确保检查点击事件中的显示值。此外,您可以使用 .closest() 方法检查点击是在模式内还是模式外发生的。我确保在检查中也包括了打开按钮。
document.addEventListener("click", function(event) {
var search_box_visible = search_box.style.display;
if(search_box_visible !== 'none'){
if (event.target.closest('#search-box-top') || event.target.closest('#open-search-box')) {
console.log("inside")
}
else{
console.log("outside")
//search_box.style.display = "none";
}
}
});
William McDonald
2020-03-02