首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >隐藏弹出框功能恢复打开的弹出框功能

隐藏弹出框功能恢复打开的弹出框功能
EN

Stack Overflow用户
提问于 2020-03-17 19:05:35
回答 1查看 120关注 0票数 0

我想让一个“弹出”框激活一个按钮,以减少所有其他元素的不透明度。当用户单击“开箱即出”时,它应该会消失,并且不透明应该恢复正常。然而,这两种功能是相互冲突的。它要求我按两次按钮才能调用showBox()。如果我在浏览器的控制台中重新调用hideOnClickOutside(document.querySelector('div'));,那么单击“打开方框”就什么都不会做。

为什么我必须点击“新音频”两次,为什么hideOnClickOutside()不能工作,除非重新调用?

代码语言:javascript
复制
function showBox() {
  document.body.style.opacity = "0.5";
  document.querySelector('div').style.display = "block";
}

document.querySelector('button').addEventListener('click', showBox);
const isVisible = elem => && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); // source (2018-03-11): https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js
function hideOnClickOutside(element) {
  const outsideClickListener = event => {
    if (!element.contains(event.target) && isVisible(element)) { // or use: event.target.closest(selector) === null
      element.style.display = 'none';
      removeClickListener()
      document.body.style.opacity = "1";
    }
  }

  const removeClickListener = () => {
    document.removeEventListener('click', outsideClickListener)
  }

  document.addEventListener('click', outsideClickListener)
}

hideOnClickOutside(document.querySelector('div'));
代码语言:javascript
复制
<button>New Audio</button>

<div style="display: none">
  <button>Record Directly</button>
</div>

hideOnClickOutside()函数取自another StackOverflow answer

编辑

我发现它需要两次单击,因为在第一次单击时,调用了showBox(),但紧接着调用了outsideClickListener,此时元素是可见的,用户单击了“外部”元素。这将恢复showBox()的样式更改。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-18 17:14:24

最简单的修复方法是存储对"New“button的引用,并检查它是否是单击documenttarget。如果是这样的话,那么return就会从函数中删除,而不会更新DOM

代码语言:javascript
复制
const button = document.querySelector('button')
button.addEventListener('click', showBox);
// ..
function hideOnClickOutside(element) {
  const outsideClickListener = event => {
    if (event.target === button) return 
// ..

请记住,使用当前的代码,hideOnClickOutside函数只会在第一次isVisible为真而target不是button时才会获得,因为在这种情况下将删除事件侦听器。

代码语言:javascript
复制
function showBox(e) {
  document.body.style.opacity = "0.5";
  document.querySelector('div').style.display = "block";
}
const button = document.querySelector('button')
button.addEventListener('click', showBox);
const isVisible = elem => && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); // source (2018-03-11): https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js
function hideOnClickOutside(element) {
  const outsideClickListener = event => {
    if (event.target === button) return 
    if (!element.contains(event.target) && isVisible(element)) { // or use: event.target.closest(selector) === null
      element.style.display = 'none';
      removeClickListener()
      document.body.style.opacity = "1";
    }
  }

  const removeClickListener = () => {
    document.removeEventListener('click', outsideClickListener)
  }

  document.addEventListener('click', outsideClickListener)
}

hideOnClickOutside(document.querySelector('div'));
代码语言:javascript
复制
<button>New Audio</button>

<div style="display: none">
  <button>Record Directly</button>
</div>

另一个问题是,一旦调用了showBox函数,您可能实际上希望将button考虑在外部。让我们重构您的代码以存储对showButtonbox的引用,向disable disable showButton添加一个标志,并且只在单击showButton时将事件侦听器添加到文档中,并仅在显示框时删除事件侦听器。

稍后,您可以重构它以适应您的特定用例。其思想是考虑应用程序所处的各种状态,并创建函数来管理该状态。

代码语言:javascript
复制
const box = document.querySelector('#box');
const showButton = document.querySelector('#show-button');
showButton.addEventListener('click', showBox);

let isDisabled = false;
const isVisible = elem => && (elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length); // source (2018-03-11): https://github.com/jquery/jquery/blob/master/src/css/hiddenVisibleSelectors.js

function toggleDisabled(bool) {
    showButton.attributes.disabled = bool;
    isDisabled = bool;
}

function toggleDisplay(display, opacity) {
    document.body.style.opacity = opacity;
    box.style.display = display;
}

function showBox(event) {
  if (!isDisabled) {
    event.preventDefault();
    event.stopPropagation();
    toggleDisplay("block", 0.5);
    toggleDisabled(true);
    document.addEventListener('click', outsideClickListener);
  }
}

function outsideClickListener(event) {
  if (!box.contains(event.target) && isVisible(box)) { // or use: event.target.closest(selector) === null
    toggleDisplay("none", 1);
    toggleDisabled(false);
    document.removeEventListener('click', outsideClickListener)
  }
}
代码语言:javascript
复制
<button id="show-button">New Audio</button>

<div id="box" style="display: none">
  <button>Record Directly</button>
</div>

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60728755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档