开发者问题收集

仅当元素可见时才执行点击功能

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