使用 Javascript 获取元素的继承(级联)祖先 CSS 类

Posted

技术标签:

【中文标题】使用 Javascript 获取元素的继承(级联)祖先 CSS 类【英文标题】:Get element's inherited (cascaded) ancestor CSS classes using Javascipt 【发布时间】:2020-08-16 17:01:44 【问题描述】:

window.onload = function() 
    var elements = document.querySelectorAll('body *');
    for (var i = 0; i < elements.length; i++) 
        elements[i].addEventListener("click", function(e) 
            console.log(e.target.className + "->" + e.target.parentNode.className);
        );
    
;
.outer_box_green
  border-style:solid;
  border-color:green;

.inner_box_thick
  margin:2px;
  padding:3px;
  border-style:dashed;
  border-width:4px;


.line_1
  font-size:2em;
  display:block;

.line_2
  font-size:4em;
  <body>
    <div class="outer_box_green">
      <div class="inner_box_thick another_inner_box_class">
        <span class="line_1">Line 1</span>
        <span class="line_2">Line 2</span>
        <div>Line 3</div>
      </div>
    </div>
  </body>

使用 vanilla javascript,我们如何获取被点击元素的类以及被点击元素嵌套在其中的“祖先”元素的所有类。例如,如果我们有

<div class="outer_box_green">
  <div class="inner_box_thick another_inner_box_class">
    <span class="line_1">Line 1</span>
    <span class="line_2">Line 2</span>
    <div>Line 3</div>
  </div>
</div>

期望的行为是在单击元素时获取包含祖先类的 Javascript 数组:

“第 1 行”被单击 ["line_1", "inner_box_thick", "another_inner_box_class", "outer_box_green"] “第 2 行”被单击 ["line_2", "inner_box_thick", "another_inner_box_class", "outer_box_green"] “第 3 行”被单击 ["inner_box_thick", "another_inner_box_class", "outer_box_green"]

我想出了如何使用parentNode.className 打印类,但它只上升了一级(参见 sn-p)。如何一次获取所有嵌套 html 祖先的所有 CSS 类?

【问题讨论】:

【参考方案1】:

您可以向上移动 DOM 树,直到 parentNode 变为 null

window.onload = function() 
  var elements = document.querySelectorAll('body *');
  for (let i = 0; i < elements.length; i++) 
    elements[i].addEventListener("click", function(e) 
      const classNames = [];
      let node = e.target;
      while(node != null)
        if(node.className) classNames.push(node.className);
        node = node.parentNode;
      
      console.log(...classNames);
    );
  
;
.outer_box_green 
  border-style: solid;
  border-color: green;


.inner_box_thick 
  margin: 2px;
  padding: 3px;
  border-style: dashed;
  border-width: 4px;


.line_1 
  font-size: 2em;
  display: block;


.line_2 
  font-size: 4em;
<div class="outer_box_green">
  <div class="inner_box_thick another_inner_box_class">
    <span class="line_1">Line 1</span>
    <span class="line_2">Line 2</span>
    <div>Line 3</div>
  </div>
</div>

【讨论】:

以上是关于使用 Javascript 获取元素的继承(级联)祖先 CSS 类的主要内容,如果未能解决你的问题,请参考以下文章

为啥 enumerable: false 不会级联到 TypeScript 中的继承类?

如何在代码中首先在 TPT(每种类型的表)继承中启用级联删除?

级联/继承/共享 Rails 配置环境

在 javascript 中访问级联 JSON

JavaScript语言精粹

级联日期的练习题