Javascript 仅将 addEventListener 添加到父样式,父子样式都不同

标签 javascript html css

目前有一个 div 控制元素的宽度以及背景颜色。该 div 有一个子 div,其内容是半透明的。这就是为什么我需要第一个 div。所以背景很扎实。

现在,我向父级添加了一个事件监听器,它扩展了一个的宽度并减小了另外 2 个的宽度,以便它们都适合。但是,当我单击父 div 时,我希望该特定 div 的子级添加一个类并从其他 2 个中删除一个类。我似乎无法弄清楚。这是代码。抱歉,如果我的格式很差,第一次在堆栈溢出上发帖,我用谷歌搜索了所有内容以寻找答案,但似乎找不到答案。

var purchaseStepCont = document.querySelectorAll(".step-container");
var purchaseStep = document.querySelectorAll(".step");

for (var i = 0; i < purchaseStepCont.length; i++) {
  purchaseStepCont[i].addEventListener("click", function() {
    for (var i = 0; i < purchaseStepCont.length; i++) {
      purchaseStepCont[i].classList.remove("stepContActive");
      purchaseStepCont[i].classList.add("stepContDeactive");
      this.classList.add("stepContActive");
      this.classList.remove("stepContDeactive");
    }
  });
}
<div class="step-container">
  <div class="step">
    <h1>01.</h1>
    <h3>words</h3>
    <p>wods</p>
  </div>
</div>
<div class="step-container">
  <div class="step">
    <h1>01.</h1>
    <h3>words</h3>
    <p>wods</p>
  </div>
</div>
<div class="step-container">
  <div class="step">
    <h1>01.</h1>
    <h3>words</h3>
    <p>wods</p>
  </div>
</div>

最佳答案

你非常接近。但是如果要将类添加到 .step,则需要 this.firstElementChild.classList.add(...) 而不是 this.classList。 add(...)(因为 this 将是 .step-container,而不是 .step;但是 .step 是它的第一个子元素)。或者为了获得更大的标记灵 active ,您可以使用 this.querySelector(".step")

您也可以只使用一个事件处理函数,而不是在循环中重新创建它:

var purchaseStepCont = document.querySelectorAll(".step-container");
var purchaseStep = document.querySelectorAll(".step");
function clickHandler() {
  var thisStep = this.firstElementChild; // Or this.querySelector(".step") would be more flexible
  for (var i = 0; i < purchaseStep.length; i++) {
    if (purchaseStep[i] === thisStep) {
      purchaseStep[i].classList.add("stepContActive");
      purchaseStep[i].classList.remove("stepContDeactive");
    } else {
      purchaseStep[i].classList.remove("stepContActive");
      purchaseStep[i].classList.add("stepContDeactive");
    }
  }
}

for (var i = 0; i < purchaseStepCont.length; i++) {
  purchaseStepCont[i].addEventListener("click", clickHandler);
}
.stepContActive {
  color: blue;
}
.stepContDeactive {
  color: #ddd;
}
<div class="step-container">
  <div class="step">
    <h1>01.</h1>
    <h3>words</h3>
    <p>wods</p>
  </div>
</div>
<div class="step-container">
  <div class="step">
    <h1>01.</h1>
    <h3>words</h3>
    <p>wods</p>
  </div>
</div>
<div class="step-container">
  <div class="step">
    <h1>01.</h1>
    <h3>words</h3>
    <p>wods</p>
  </div>
</div>

如果您不需要支持 IE11,

clickHandler 可以更短一些:

function clickHandler() {
  var thisStep = this.firstElementChild; // Or this.querySelector(".step") would be more flexible
  for (var i = 0; i < purchaseStep.length; i++) {
    purchaseStep[i].classList.toggle("stepContActive", purchaseStep[i] === thisStep);
    purchaseStep[i].classList.toggle("stepContDeactive", purchaseStep[i] !== thisStep);
  }
}

但是 IE11 不支持 classList.toggle 的第二个参数。

关于Javascript 仅将 addEventListener 添加到父样式,父子样式都不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46243315/

相关文章:

javascript - 使用 jquery 在 html 中动态插入行?

php - 如何在 PHP 中使用 JavaScript 变量?

javascript - 带有 HTML5 输出的小数点

javascript - jQuery 中点击滚动菜单的小错误

html - SCSS - 从一组样式中排除指定的容器

javascript - AngularJS - 解析的数据不会在嵌套状态组件中刷新

javascript - 获取node.js/javascript中对象的内容

html - 重新处理 ie7 中的 block 内容

jquery - jQuery.css 的不同值 ('top-margin' ) 边距 :auto based on browser

javascript - 是否可以编辑 svg :image styles in the browser?(使用 D3)