首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在按钮单击时为多个元素切换类

在按钮单击时为多个元素切换类
EN

Stack Overflow用户
提问于 2019-06-26 08:01:34
回答 2查看 82关注 0票数 0

我有一系列的按钮,当点击时会显示一个带有选项的框,但当我点击其他按钮时,框保持可见。当我单击一个按钮或其他框外消失时,我该怎么办?

代码语言:javascript
复制
<div class="container">
    <button class="popup-btn" data-itemid="1"> Button 1</button> 
    <input type="text" id="alvo-1" />
    <div id="popup-1" class="popup">
        <li data-alvo="1">item 1</li>
        <li data-alvo="1">item 2</li>
        <li data-alvo="1">item 3</li>
    </div>
</div>

<div class="container">
    <button class="popup-btn" data-itemid="2"> Button 2</button>
    <input type="text" id="alvo-2" />
    <div id="popup-2" class="popup">
        <li data-alvo="2">item 1</li>
        <li data-alvo="2">item 2</li>
        <li data-alvo="2">item 3</li>
    </div>
</div>



.container{
  position: relative;
}
 .popup {
  position: absolute;
  display: none;
}

.popup.visible {
  display: block;
}




var button = document.querySelectorAll(".popup-btn")
var pop = document.querySelectorAll(".popup")
var li = document.querySelectorAll("li")



button.forEach(item => {
  item.addEventListener('click', () => {

    let popup = document.getElementById("popup-" + event.target.dataset.itemid);
        popup.classList.toggle("visible");

  })
})


li.forEach(item => {
 item.addEventListener('click', () => {

    let alvo = document.getElementById("alvo-" + event.target.dataset.alvo);
        alvo.value = event.target.innerHTML

    let popup = item.parentNode;
        popup.classList.toggle("visible");

  })        
})

我试图在按钮内部使用forEach,但它不起作用

jsfiddle example

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-26 09:35:00

代码语言:javascript
复制
document.querySelectorAll(".popup-btn").forEach(item => {

  item.addEventListener('click', event => {

    /* Reset visible state of all popup lists to hidden */
    document
      .querySelectorAll(".popup")
      .forEach(popup => popup.classList.remove('visible'));

    /* Update visible state of sibling popup list (relative to clicked
    button) by selecting .popup from this buttons parent */
    const parentContainer = event
      .currentTarget
      .parentElement;

    const siblingPopup = parentContainer
      .querySelector('.popup');

    siblingPopup
      .classList
      .add("visible");
  })
});

/* Setup "hide" behavior when user clicks outside of a visible popup box */
document.querySelectorAll(".popup").forEach(popup => {
  popup.addEventListener('click', event => {
    if (event.target === popup) {
      popup
        .classList
        .remove("visible");
    }
  });
});
代码语言:javascript
复制
.container {
  position: relative;
}

.popup {
  position: absolute;
  background: red;
  display: none;
}

.popup.visible {
  display: block;
}

/* Create invisble region that triggers
the popup to hide when clicked */
.popup.visible:before {
  content: '';
  display: block;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
}
代码语言:javascript
复制
<div class="container">
  <button class="popup-btn"> Button 1</button>
  <input type="text">
  <ul class="popup">
    <li data-alvo="1">item 1</li>
    <li data-alvo="1">item 2</li>
    <li data-alvo="1">item 3</li>
  </ul>
</div>

<div class="container">
  <button class="popup-btn"> Button 2</button>
  <input type="text">
  <ul class="popup">
    <li data-alvo="2">item 1</li>
    <li data-alvo="2">item 2</li>
    <li data-alvo="2">item 3</li>
  </ul>
</div>

票数 0
EN

Stack Overflow用户

发布于 2019-06-26 08:11:31

一种方法是通过该按钮parentElement选择同级弹出窗口(相对于被单击的按钮)。这样做的一个好处是,它消除了对自定义data属性的依赖(即在按钮标记中)。

此外,为了实现用户在弹出框外单击时的隐藏行为,您可以使用CSS伪元素来“捕捉”在弹出框“内部内容”之外的用户单击:

代码语言:javascript
复制
.popup.visible:before {
  content: '';
  display: block;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
}

这里的想法是通过CSS定义一个临时的不可见元素,只有在弹出窗口可见时才会出现。单击时,此不可见元素在相应的弹出窗口上触发单击事件,此时您可以确定是否应隐藏弹出窗口(即弹出窗口是否与event.target匹配):

代码语言:javascript
复制
document.querySelectorAll(".popup-btn").forEach(item => {

  item.addEventListener('click', event => {

    /* Reset visible state of all popup lists to hidden */
    document
      .querySelectorAll(".popup")
      .forEach(popup => popup.classList.remove('visible'));

    /* Update visible state of sibling popup list (relative to clicked
    button) by selecting .popup from this buttons parent */
    const parentContainer = event
      .currentTarget
      .parentElement;

    const siblingPopup = parentContainer
      .querySelector('.popup');

    siblingPopup
      .classList
      .add("visible");
  })
});

/* Setup "hide" behavior when user clicks outside of a visible popup box */
document.querySelectorAll(".popup").forEach(popup => {
  popup.addEventListener('click', event => {
    if (event.target === popup) {
      popup
        .classList
        .remove("visible");
    }
  });
});
代码语言:javascript
复制
.container {
  position: relative;
}

.popup {
  position: absolute;
  background: red;
  display: none;
}

.popup.visible {
  display: block;
}

/* Create invisble region that triggers
the popup to hide when clicked */
.popup.visible:before {
  content: '';
  display: block;
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: -1;
}
代码语言:javascript
复制
<div class="container">
  <button class="popup-btn"> Button 1</button>
  <input type="text">
  <ul class="popup">
    <li data-alvo="1">item 1</li>
    <li data-alvo="1">item 2</li>
    <li data-alvo="1">item 3</li>
  </ul>
</div>

<div class="container">
  <button class="popup-btn"> Button 2</button>
  <input type="text">
  <ul class="popup">
    <li data-alvo="2">item 1</li>
    <li data-alvo="2">item 2</li>
    <li data-alvo="2">item 3</li>
  </ul>
</div>

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

https://stackoverflow.com/questions/56763471

复制
相关文章

相似问题

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