JavaScript DOM操作:点击关联元素获取目标文本内容的教程

1次阅读

JavaScript DOM操作:点击关联元素获取目标文本内容的教程

本教程详细介绍了如何通过javaScript处理用户点击事件,并结合dom的 closest() 和 querySelector() 方法,从复杂的html结构中准确获取目标元素的文本内容。文章强调了使用 addEventListener() 进行事件绑定、避免重复ID以及高效DOM遍历的最佳实践,帮助开发者在动态交互场景下精确操作DOM。

在Web开发中,我们经常需要实现这样的交互:用户点击页面上的某个元素(如一个图标或按钮),然后程序需要根据这个点击事件,获取或操作页面中与被点击元素相关联的另一个元素的文本或属性。例如,在一个列表项中,点击一个“编辑”图标,然后获取该列表项中某个标题的文本内容。本教程将指导您如何利用javascript和DOM API,以一种健壮且高效的方式实现这一常见需求。

场景分析与需求定义

假设我们有一个展示服务项的页面,每个服务项都包含一个可点击的编辑图标和一个标题链接。我们的目标是:当用户点击某个服务项的编辑图标时,能够准确地获取该服务项内部标题链接(标签)的文本内容,并可进一步将其用于其他操作,例如填充到一个输入框中。

原始的HTML结构可能如下所示,其中包含了一些需要注意的细节:

立即学习Java免费学习笔记(深入)”;

<div class="swiper-slide">     <i class="fa-regular fa-pen-to-square" id="update_pen" onclick="update_function()"></i>     <div class="services-item mb-40 elementor-repeater-item-78d8e80" id="swiper-slide-one">         <div class="services-item__content">             <h4 class="services-item__tp-title mb-30">                 <a href="service-details.html">Hello</a>             </h4>             <div class="text_area_box" id="text_area_box">                 <input type="text" name="" required="">                 <label>Titre</label>             </div>         </div>     </div> </div>

在处理此类需求时,有几个关键的最佳实践和注意事项:

JavaScript DOM操作:点击关联元素获取目标文本内容的教程

Motiff

Motiff是由猿辅导旗下的一款界面设计工具,定位为“AI时代设计工具”

JavaScript DOM操作:点击关联元素获取目标文本内容的教程 126

查看详情 JavaScript DOM操作:点击关联元素获取目标文本内容的教程

  1. id 属性的唯一性: HTML规范规定,id 属性在整个文档中必须是唯一的。如果上述服务项结构会在页面中重复出现(例如在一个列表中),那么像 update_pen, swiper-slide-one, text_area_box 这样的 id 属性就不应该被重复使用。在这种情况下,我们应该使用类(class)来标识这些元素。
  2. 事件绑定方式: onclick 属性直接嵌入HTML是一种较旧的事件绑定方式,不推荐在现代JavaScript开发中使用。它难以维护,且在复杂场景下功能受限。推荐使用 addEventListener() 方法进行事件绑定,它提供了更灵活的事件管理能力,并能更好地分离HTML结构与JavaScript行为。
  3. DOM遍历效率: 对于复杂或嵌套的DOM结构,直接使用 parentnode、nextSibling、firstChild 等属性进行链式遍历可能会变得冗长且易出错。更推荐使用 closest() 和 querySelector() 等方法,它们提供了更强大和简洁的DOM遍历能力。

优化HTML结构

为了遵循最佳实践并更好地支持多实例场景,我们首先对HTML结构进行优化。我们将移除重复的 id 属性,并为可点击的图标添加一个通用的类名 button,以便于JavaScript选择和事件绑定。

<div class="swiper-slide">   <i class="button fa-regular fa-pen-to-square">点击编辑</i>   <div class="services-item mb-40 elementor-repeater-item-78d8e80">     <div class="services-item__content">       <h4 class="services-item__tp-title mb-30">         <a href="service-details.html">Hello</a>       </h4>       <div class="text_area_box">         <input type="text" name="" required="" />         <label>Titre</label>       </div>     </div>   </div> </div>  <div class="swiper-slide">   <i class="button fa-regular fa-pen-to-square">点击编辑</i>   <div class="services-item mb-40 elementor-repeater-item-78d8e80">     <div class="services-item__content">       <h4 class="services-item__tp-title mb-30">         <a href="service-details.html">goodbye</a>       </h4>       <div class="text_area_box">         <input type="text" name="" required="" />         <label>Titre</label>       </div>     </div>   </div> </div>

现在,我们有了多个独立的 .swiper-slide 元素,每个元素内部都包含一个 .button 元素和一个 链接,以及一个 input 字段。

JavaScript实现:事件监听与高效DOM遍历

我们将使用 document.querySelectorAll() 选中所有目标按钮,并通过 foreach 循环为每个按钮绑定点击事件。在事件处理函数中,我们将利用 Event.target、Element.closest() 和 Element.querySelector() 来实现精准的DOM遍历和文本获取。

  1. 选中所有按钮并绑定事件: 使用 document.querySelectorAll(‘i.button’) 来获取页面上所有带有 button 类的 元素。然后,通过 forEach 循环为每个找到的元素添加一个 click 事件监听器。

  2. 利用 Event.target 获取点击源: 在事件监听器内部,事件对象 e 的 e.target 属性将指向实际被点击的 元素。

  3. 向上遍历DOM树:Element.closest() 从 e.target 开始,我们需要找到其最近的共同祖先元素,该祖先元素能够唯一标识一个完整的服务项。在本例中,这个祖先元素是带有 swiper-slide 类的

    。closest(‘.swiper-slide’) 方法能够高效地完成这一任务,它会从当前元素开始,向上查找(包括自身)第一个匹配指定css选择器的祖先元素。

  4. 向下遍历DOM树:Element.querySelector() 一旦我们通过 closest() 找到了代表整个服务项的父容器(例如 parentSlide),我们就可以在其内部使用 querySelector(‘a’) 来查找目标 元素。querySelector() 会在该父容器的子孙元素中搜索第一个匹配选择器的元素,确保我们获取的是当前服务项的标题链接。

  5. 获取文本内容:Node.textContent 获取到目标 元素后,使用其 textContent 属性即可获取其包含的纯文本内容,不包括任何HTML标签。

  6. (可选)将文本赋值给输入框: 同样地,在 parentSlide 内部使用 querySelector(‘input’) 可以找到对应的输入框,然后将获取到的文本赋值给它的 value 属性。

  7. 下面是完整的JavaScript代码实现:

    // 1. 选中所有带有 'button' 类的图标元素 document.querySelectorAll('i.button').forEach(el => {   // 2. 为每个图标元素添加点击事件监听器   el.addEventListener('click', e => {     // 3. 从被点击的元素 (e.target) 开始,向上查找最近的 '.swiper-slide' 祖先元素     // 这确保了我们操作的是与被点击按钮相关联的那个服务项容器     const parentSlide = e.target.closest('.swiper-slide');      // 4. 在找到的 '.swiper-slide' 容器内部,使用 querySelector() 查找 'a' 元素     // 这确保了我们获取的是当前服务项的标题链接     const anchorElement = parentSlide.querySelector('a');      // 5. 获取 'a' 元素的文本内容     const text = anchorElement.textContent;     console.log("成功获取到的标题文本内容:", text); // 打印到控制台      // 6. (可选)将获取到的文本赋值给同服务项中的输入框     const inputElement = parentSlide.querySelector('input');     if (inputElement) { // 检查输入框是否存在       inputElement.value = text;       console.log("文本已成功赋值给输入框:", inputElement.value);     }   }); });

    关键概念与最佳实践总结

    • Event.target: 在任何事件处理函数中,e.target 属性始终指向实际触发事件的那个DOM元素,即使事件是通过事件冒泡到达监听器的。
    • Element.closest(selector): 这是一个非常强大的DOM遍历方法。它从当前元素开始,沿着DOM树向上(包括当前元素自身)查找,直到找到第一个与指定css选择器匹配的祖先元素。如果找不到,则返回 NULL。它极大地简化了查找共同父级或特定祖先元素的操作,比手动链式调用 parentNode 更简洁、更健壮。
    • Element.querySelector(selector): 与 document.querySelector() 类似,但它在指定元素的子孙元素中查找第一个匹配CSS选择器的元素。这限制了搜索范围,提高了效率和准确性,尤其是在处理重复组件时。
    • Node.textContent: 用于获取元素及其所有子孙节点的纯文本内容。与 innerHTML 不同,它不会返回HTML标签,只返回可见文本。
    • 事件监听器 addEventListener(): 这是现代JavaScript中推荐的事件绑定方式。它允许为同一个元素绑定多个相同类型的事件处理器,且能更好地管理事件的生命周期。
    • 避免重复 id: 再次强调,id 属性在HTML文档中必须是唯一的。对于可重复的组件或元素集合,应优先使用类(class)进行标识和选择。
    • 事件委托(Event Delegation): 对于页面上大量动态添加或重复出现的元素,如果它们共享一个共同的祖先元素,可以考虑在祖先元素上绑定一个事件监听器,然后通过检查 e.target 来判断是哪个子元素触发了事件。这种技术可以减少内存占用,提高性能。本教程的示例中,为每个按钮单独绑定监听器是可行的,但当按钮数量非常庞大时,事件委托会是更好的选择。

    总结

    本教程详细阐述了如何通过结合 addEventListener() 进行事件监听,并利用 closest() 和 querySelector() 这两个高效的DOM遍历方法,在复杂的HTML结构中精准定位并获取目标元素的文本内容。掌握这些现代JavaScript和DOM操作技巧,将使您能够编写出更加灵活、高效、易于维护且符合最佳实践的Web交互代码,从而更好地响应用户行为并动态管理网页内容。

text=ZqhQzanResources