You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何选择带::before伪元素的img的src属性

问题解答

1. 是不是::before伪元素导致的问题?

不是。::before是CSS生成的伪元素,不属于真实DOM结构,浏览器的DOM API(包括document.querySelector)不会识别到它,完全不会干扰元素选择逻辑。

2. 为什么会返回未选中元素的img src?

大概率是点击事件触发时,selected类还没完成切换(比如页面处理选中状态的逻辑执行顺序在你的点击事件之后),导致querySelector拿到的还是之前选中的元素;也可能是页面中存在多个匹配span.selected的元素(从你的结构看应该是前者)。

3. 解决方法

方法一:通过事件对象定位点击目标(最可靠)

利用ev.target找到点击元素所属的swatch容器,手动切换选中状态后再获取img的src:

document.getElementById("div1").addEventListener("click", function(ev) {
  // 找到点击元素对应的swatch容器
  const clickedSwatch = ev.target.closest('.swatch');
  if (!clickedSwatch) return;

  // 移除所有swatch的selected类,给当前点击的添加
  document.querySelectorAll('#div1 .swatch').forEach(swatch => swatch.classList.remove('selected'));
  clickedSwatch.classList.add('selected');

  // 获取当前选中swatch内的img src
  const targetImg = clickedSwatch.querySelector('.swatches_image_container img');
  if (targetImg) {
    console.log(targetImg.src);
  }
});

方法二:确保获取元素的时机在选中状态更新后

如果页面有其他逻辑负责切换selected类,把你的获取代码放在该逻辑之后,或者用异步方式延迟获取(仅作应急方案):

document.getElementById("div1").addEventListener("click", function() {
  setTimeout(() => {
    const selectedImg = document.querySelector('#div1 > span.selected > span.swatches_image_container > img');
    if (selectedImg) {
      console.log(selectedImg.src);
    }
  }, 0);
});

方法三:给img添加专属类简化选择

如果可以给img加自定义class(比如swatch-img),选择器会更简洁:

<!-- 修改后的img标签 -->
<img class="swatch-img" src="white.jpg" alt="white">
document.getElementById("div1").addEventListener("click", function() {
  const selectedImg = document.querySelector('#div1 span.selected .swatch-img');
  console.log(selectedImg?.src);
});

内容的提问来源于stack exchange,提问作者Aquarius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:52:03