首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单击img时单击div上的事件和不触发的文本。

单击img时单击div上的事件和不触发的文本。
EN

Stack Overflow用户
提问于 2018-11-19 20:10:42
回答 2查看 60关注 0票数 0

我用ES6/vanilla JS写了切换脚本。预期的功能非常简单,您可以单击切换div,它将一个active类添加到另一个div中,该div与toggle的data-toggle属性匹配。在我的切换div,我需要有文字和图像。当您单击div中的文本时,它会工作得很好,但是当您单击div中的图像时,切换将不会触发。我是否需要做一些具体的工作来把所有的孩子都包括在div中?

由于某些原因,我甚至无法通过这个代码片段编辑器来实现这个功能,但是它在我的项目中工作。

代码语言:javascript
复制
const setActive = (toggles, panels, id) => {
  let activePanel = panels.filter(panel => panel.getAttribute('data-toggle') == id)
  let activeToggle = toggles.filter(toggle => toggle.getAttribute('data-toggle') == id)
  activePanel.forEach(panel => panel.classList.add('active'))
  activeToggle.forEach(toggle => toggle.classList.add('active'))
}

const removeActive = (nodes) => {
  nodes.forEach(node => node.classList.remove('active'))
}

const handler = (event) => {
  event.preventDefault()
  let id = event.target.getAttribute('data-toggle')
  let panels = Array(...document.querySelectorAll('.js-toggle-panel'))
  let toggles = Array(...document.querySelectorAll('.js-toggle'))
  removeActive(panels)
  removeActive(toggles)
  setActive(toggles, panels, id)
}

let toggles = Array(...document.querySelectorAll('.js-toggle'))
toggles.forEach(toggle => toggle.addEventListener('click', handler))
代码语言:javascript
复制
.toggle-panel {
  display: none;
}

.toggle-panel .active {
  display: block;
}
代码语言:javascript
复制
<div class="js-toggle toggle" data-toggle="toggle-1">
  <img src="https://via.placeholder.com/50"> First toggle
</div>

<div class="js-toggle toggle" data-toggle="toggle-2">
  Second toggle
</div>

<div class="js-toggle-panel toggle-panel" data-toggle="toggle-1">
  <h1>Toggle 1</h1>
</div>

<div class="js-toggle-panel toggle-panel" data-toggle="toggle-2">
  <h1>Second toggle!</h1>
</div>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-19 20:59:33

我改变了两件事,我相信这能解决你的问题:

  1. 我将选择器.toggle-panel .active更改为.toggle-panel.active--如果没有,即使在JS按您的意愿工作的情况下,也没有任何东西是可见的。
  2. 我将您的代码从使用event.target移到了event.currentTarget --前者总是指向单击元素,而后者则指向已放置侦听器的元素。

看下面的片段。

代码语言:javascript
复制
const setActive = (toggles, panels, id) => {
  let activePanel = panels.filter(panel => panel.getAttribute('data-toggle') == id)
  let activeToggle = toggles.filter(toggle => toggle.getAttribute('data-toggle') == id)
  activePanel.forEach(panel => panel.classList.add('active'))
  activeToggle.forEach(toggle => toggle.classList.add('active'))
}

const removeActive = (nodes) => {
  nodes.forEach(node => node.classList.remove('active'))
}

const handler = (event) => {
  event.preventDefault()
  let id = event.currentTarget.getAttribute('data-toggle')
  let panels = Array(...document.querySelectorAll('.js-toggle-panel'))
  let toggles = Array(...document.querySelectorAll('.js-toggle'))
  removeActive(panels)
  removeActive(toggles)
  setActive(toggles, panels, id)
}

let toggles = Array(...document.querySelectorAll('.js-toggle'))
toggles.forEach(toggle => toggle.addEventListener('click', handler))
代码语言:javascript
复制
.toggle-panel {
  display: none;
}

.toggle-panel.active {
  display: block;
}
代码语言:javascript
复制
<div class="js-toggle toggle" data-toggle="toggle-1">
  <img src="https://via.placeholder.com/50"> First toggle
</div>

<div class="js-toggle toggle" data-toggle="toggle-2">
  Second toggle
</div>

<div class="js-toggle-panel toggle-panel" data-toggle="toggle-1">
  <h1>Toggle 1</h1>
</div>

<div class="js-toggle-panel toggle-panel" data-toggle="toggle-2">
  <h1>Second toggle!</h1>
</div>

票数 2
EN

Stack Overflow用户

发布于 2018-11-19 20:47:52

event.target不同,您应该在handler函数中使用event.currentTarget来返回连接事件侦听器的节点。event.target正在返回<img>节点,而不是在您的示例中返回带有data-toggle<div>

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

https://stackoverflow.com/questions/53381930

复制
相关文章

相似问题

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