【问题标题】:How to add alt text to an image using a data attribute on the parent?如何使用父级上的数据属性向图像添加替代文本?
【发布时间】:2021-10-18 19:53:42
【问题描述】:

我正在尝试通过将数据属性分配给该图像的父容器来确定如何将 alt-text 属性添加到该图像。

基本上,我添加到data-alt 的任何文本都会在img 元素上分配为alt-text

如何编写属性以便将其作为alt-text 应用于图像,而不是父图像?

我想在代码编辑器中输入的内容:

<div class="image-parent" data-alt="hello world">
    <img src="path/to/image">
</div>

我想要的结果:

<div class="image-parent">
  <img src="path/to/image" alt="hello world">
</div>

这是我尝试过的,但我不明白如何将数据属性应用于图像的子元素。

let imgParentContainers = document.querySelector('.image-parent');
let dataAlt = imgParentContainers.setAttribute('data-alt', '');
<div class="image-parent" data-alt="alt text here">
  <img src="https://apkdoll.com/wp-content/uploads/2021/08/HOLLA-Live-Random-Video-Chat-MOD-APK.png">
</div>

【问题讨论】:

  • 您认为setAttribute() 究竟会返回什么? (提示:答案是undefined)。您为什么要尝试将其分配给变量?
  • 目前,该属性正在分配给父级 (image-parent),但我需要看到它分配给图像,而不是父容器。
  • 你没有回答我的问题。考虑到右手表达式和setAttribute 总是返回undefined 的事实,您期望dataAlt 设置为什么?你不希望一个名为setAttribute 的方法能做到这一点(设置一个属性的值)吗?
  • 你一直在重复这个问题(但很清楚你想要发生什么)。 esqew 试图提出一些基本问题,以便您考虑有缺陷的代码实际上做了什么,并在自己修复它的同时学习一些东西。
  • 这是一个简短的版本:jsfiddle.net/heL3x9j7

标签: javascript html


【解决方案1】:

您需要进行一些改进才能达到您想要的目标状态:

  1. 不清楚为什么要使用setAttribute() 从属性中获取数据。顾名思义,它仅用于设置属性的值。更好的尝试是使用getAttribute(),但在这种情况下,由于您访问的是data-* 元素,您可能应该改用HTMLElement.dataset
  2. 除非您预计只有一个具有类 image-parent 的元素,否则您绝对应该将 querySelector 的使用替换为 querySelectorAll,以确保您获得任何/所有匹配项的 NodeList,而不仅仅是第一个匹配项在 DOM 中找到。在这种情况下,您还必须为 (a) 与您的 .image-parent 选择器匹配的所有父容器使用循环,并为 (b) 该容器中的每个 img 元素使用另一个循环。
  3. 在调用 querySelector/querySelectorAll 时,请更具体地使用 CSS 选择器,以避免与尝试通过匹配在第一名。
  4. 您想要的最终结果显示父容器元素上不再存在data-alt 属性;如果这实际上是理想的目标,那么您似乎没有尝试在您的 sn-p 中这样做。为此请使用 removeAttribute()

let imgParentContainers = [...document.querySelectorAll('.image-parent[data-alt]')];
imgParentContainers.forEach(parentContainer => {
    [...parentContainer.querySelectorAll('img')].forEach(imgElement => {
        imgElement.setAttribute('alt', parentContainer.dataset.alt);
    });
    parentContainer.removeAttribute('data-alt');
});
<div class="image-parent" data-alt="alt text here">
  <img src="https://apkdoll.com/wp-content/uploads/2021/08/HOLLA-Live-Random-Video-Chat-MOD-APK.png">
</div>

将来,您可能会发现使用首选搜索引擎来研究需求的每个单独组件(附加您选择的语言;在本例中为 JavaScript)以更好地了解您应该使用的方法很有用希望使用它来实现您的目标。例如,对于解决方案的每个组件,以下 Google 搜索仅在此站点上就产生了几个预先存在的线程:

【讨论】:

  • 我觉得如果我知道这些问题的所有答案......我就不需要了。当我不知道该转向哪里时,我使用 SO 作为工具。有时候,我不知道我不知道什么。
  • @Millhorn 您似乎了解需要做什么,您是否发现自己处理 Google 查询有问题?
  • 没有。老实说,它是在应用我所苦苦挣扎的概念。
  • 例如,上面的这个问题应该是一个可重复的例子,我可以用它来申请to this Codepen,但我正在努力实现。
  • 没关系...我说过,然后我想通了。不过,您的指导非常有帮助,我已经根据您的建议做了一些脑筋急转弯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 2021-08-23
相关资源
最近更新 更多