javascript - 为什么 getElementsByClassName() 访问影子 DOM 中的元素?

标签 javascript html polymer

我正在使用 Polymer 框架构建 Web 应用程序。我有一个自定义表格元素,它使用其他基本的 Polymer 元素作为构建 block 。表格元素有一列和几行信息。我正在研究一种行为以突出显示表格中的信息。突出显示行为将突出显示表格中的整行,或仅突出显示行中相关信息的特定位。

我创建了一个新的自定义元素,表格和突出显示行为将在其中发挥作用。具有突出显示行的表格会获得一类突出显示。

<link rel="import" href="../polymer/polymer.html">
<link rel="import" href="../highlight-behavior/highlight-behavior.html">
<link rel="import" href="../custom-table/custom-table.html">

<dom-module id="test-sync">
<template>
  <style>
    :host {
      display: block;
      box-sizing: border-box;
    }
  </style>

  <custom-table class="highlight"></custom-table>
  <custom-table class="highlight"></custom-table>
  <custom-table class="highlight"></custom-table>
  <custom-table class="highlight"></custom-table>

</template>

为了尝试使用统一的方法来处理突出显示功能,我还为在表格中排列行的自定义元素分配了相同的类。我完全希望将它们的属性冒泡到父级(表格),以便突出显示行为可以与它们交互。

在我写的高亮行为中:

<script>
/** @polymerBehavior HighlightBehavior*/
HighlightBehavior = { 

  attached: function() {
    console.log(this.getElementsByClassName('highlight'));
  }
}
</script>

在我的日志中,我希望只返回四个自定义表元素。结果不是这样,我也得到了自定义表格影子DOM中的元素,并带有一类高亮。现在这非常方便,但是根据我对 Polymer 的了解,这对我来说没有意义。我以为我必须直接查询影子根才能获取其中包含的元素。我想知道为什么在这种情况下城墙似乎被攻破了?

最佳答案

默认为 shady DOM,shady DOM 不会阻止您访问元素的内容。

要么启用 shadow DOM https://www.polymer-project.org/1.0/docs/devguide/settings

或使用 Polymer DOM API https://www.polymer-project.org/1.0/docs/devguide/local-dom

Polymer.dom(this.root).getElementsByClassName('highlight');

关于javascript - 为什么 getElementsByClassName() 访问影子 DOM 中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40424493/

相关文章:

javascript - 当ajax调用页面加载到div中时,如何删除 anchor 标记内链接中的哈希值

javascript - 如何检测用户何时打开浏览器?

javascript - 如何使用属性中的状态表达式动态创建 React 元素 (material-ui)

javascript - 如何检测页面何时退出全屏?

binding - 动态插入的 polymer 元素中的数据绑定(bind)

javascript - 当数量变化时如何计算表中的行总计

javascript - 使用 DropzoneJs 下载上传的文件

javascript - 将默认焦点设置在不是第一个的特定下拉选项上?

recursion - polymer 递归模板绑定(bind)

javascript - 如何使用 Polymer 渲染具有多个 AJAX 调用的内容?