我想制作一个由按钮激活的“弹出”框,以减少所有其他元素的不透明度。当用户点击框外时,它应该消失并且不透明度应该恢复正常。然而,这两个功能是相互冲突的。它需要我单击按钮两次才能showBox()被呼叫。hideOnClickOutside(document.querySelector('div'));除非我在浏览器的控制台中重新调用,否则点击开箱即用不会执行任何操作。
为什么我必须单击“新音频”两次,并且为什么hideOnClickOutside()除非重新调用否则不起作用?
function showBox() {
document.body.style.opacity = "0.5";
document.querySelector('div').style.display = "block";
}
document.querySelector('button').addEventListener('click', showBox);
const isVisible = elem => !!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'));
<button>New Audio</button>
<div style="display: none">
<button>Record Directly</button>
</div>
hideOnClickOutside()
函数取自另一个 StackOverflow 答案
我发现它需要两次单击,因为第一次单击时,showBox()
被调用,但紧接着,outsideClickListener 也被调用,此时该元素现在可见,并且用户已单击该元素的“外部”。这将恢复 的样式更改showBox()
。
冉冉说
相关分类