javascript - querySelectorAll 不返回 DOM 中的所有元素

标签 javascript dom web polymer components

我正在做一个副业项目,在该项目中生成 HTML 文件并将其发送到前端,在那里使用 Polymer 3 和其他技术对其进行格式化和显示。

长话短说,当我调用 querySelectorAll 时,它不会返回,例如 document 中的所有 anchor 标记:

document.querySelectorAll("a");

相反,它似乎只承认标签的存在,如果它们是调用 querySelectorAll 的节点的直接子节点。所以,如果我有:

<div>
  <custom-tag1>
    <custom-tag2>
      <a href="http://www.google.com">Google</a>
      <a href="http://www.yahoo.com">Yahoo!</a>
      <a href="http://www.amazon.com">Amazon</a>
    </custom-tag2>
  </custom-tag2>
</div>

我发现我必须首先获取 document 对象,然后是 body 对象,然后是位于 body 对象顶层的任何东西(假设例如,上面的 div 立即位于 body 内)等。

因此,如果我(终于!)获得对主体的引用,我可以调用:

theBody.querySelectorAll("a");

它会返回一个空列表。我必须做这样的事情:

theBody.querySelectorAll("div")[0].querySelectorAll("custom-tag1")[0].querySelectorAll("custom-tag2")[0].querySelectorAll("a");

为了得到 anchor 元素的列表!

但是,如果 anchor 存在于其他任何地方,它就不会获取它们。

注意事项: Polymer 3 服务器正在运行。 由于某些元素(至少我在 Chrome 调试器中看到的元素)是影子根,情况可能会变得复杂。

因此,有时候,我们最终会这样做:

someNode.shadowRoot.querySelectorAll("a");  

或类似的。

最佳答案

如果你做 console.log在你所有的custom-tagX元素' ready方法(和 <body> 中的 onload),然后你就会明白为什么。你会看到的结果看起来像这样......

 body is ready
 custom-tag1 is ready
 custom-tag2 is ready

...意味着当主体加载完成后,您的 Polymer 特定自定义元素将加载。

所以要解决这个问题,你需要在加载特定元素时发送一个事件,让 body 用 addEventListener 监听它.

但是,当涉及到 Polymer 时,您不应该这样想。

为什么要 <a>标签放在首位?

我会构建一个行为,并将其添加到 custom-tag2 ,每次你想用 <a> 做任何你想做的事自定义元素中的标记,只需将该行为添加到元素即可。 (我查了一下,它只是针对 Polymer 1)

我会改为使用 mixin 来共享对 <a> 执行某些操作的代码标签。

https://www.polymer-project.org/3.0/docs/devguide/custom-elements#mixins

关于javascript - querySelectorAll 不返回 DOM 中的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51906557/

相关文章:

javascript - 如何覆盖 JavaScript 函数

javascript - staggerChildren 与成帧器 Action

javascript - 选择排序后查找排序数组中数字位置的代码不稳定?

javascript - 如何在加载 DOM 后停止微调器

javascript - 如何根据用户选择创建跨度(js)

iphone - iOS/Objective-C - 如何从 iPhone 应用程序查询 Web 服务器数据库?

javascript - 支持矢量图层的基于图 block 的 map 解决方案

jquery - 如何在 dom 完成渲染后运行指令?

php - 网站速度很慢,但是如果我修改 URL,它会正常加载

php - 如何通过php连接sftp服务器