关于js点击事件的一个问题?

问题说明:
比如页面中有一个输入框元素a,我点击它时会弹出一个窗体b,我在a blur事件中关闭弹出窗体(这种方法就无法点击b窗体中的内容了),
如何做到我点击除a/b外的元素才关闭弹出窗体?不会是给所有对象加监测事件吧?

阅读 3k
2 个回答

不在 输入框ablur 事件中关闭 窗体b,而是为 document 添加 click 事件监听,判断点击元素是否为 输入框a 或者 窗体b,若不是则关闭 窗体b,示例如下:

const input = ...;
const popup = ...;

function listener({ target }) {
  if (target !== input && target !== popup && !popup.contains(target)) {
    // 关闭窗体b
  }
}

document.addEventListener("click", listener);

// document.removeEventListener("click", listener);

注意,若为单页面应用,应该在合适的时机 注册/销毁documentclick 事件监听,以避免异常情况发生。

<!DOCTYPE html>
<html>
<head>
  <title>Click Event Example</title>
</head>
<body>
  <input type="text" id="inputBox" placeholder="Click me">
  <div id="popup" style="display:none;">
    <p>This is the popup.</p>
    <button id="popupButton">Click Me</button>
  </div>

  <script>
    const inputBox = document.getElementById('inputBox');
    const popup = document.getElementById('popup');


    inputBox.addEventListener('focus', function() {
      popup.style.display = 'block';
    });

    document.addEventListener('click', function(event) {
      const target = event.target;

      if (target !== inputBox && target !== popup && !popup.contains(target)) {
        popup.style.display = 'none';
      }
    });
  </script>
</body>
</html>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题