javascript - 有没有办法阻止 shadow dom 中的 javascript 访问它之外的 DOM?

标签 javascript dom shadow-dom

所以如果我有:

enter image description here

js可以改变component_test_div中的文字

我可以阻止吗?

最佳答案

脚本不受 shadow DOM 保护

Shadow DOM 只保护 CSS 泄漏或干扰 shadowRoot 的内容。它不会为 JavaScript 创建新的命名空间。

在这段代码中,我在阴影根目录中有一些 JS:

class MyEl extends HTMLElement {
  constructor() {
    super();
    this.attachShadow({mode:'open'});
    let s = document.createElement('script');
    s.textContent = "function dog() { console.log('Bark, Bark'); }";
    this.shadowRoot.appendChild(s);
  }
}

customElements.define('my-el', MyEl);

setTimeout(()=>dog(), 2000);
<my-el></my-el>

2 秒后我们调用函数 dog() 并且它起作用了。这是因为,即使这段代码被放入 shadowRoot 中,它仍然在全局范围内执行。

鉴于无法在 Web 组件中隔离您的 JavaScript,您需要记住它对其范围内的任何人都可用。

如果将代码放在 IIFE 中,则可以防止外部调入。但是仍然没有办法阻止内部调出或操作作用域外的东西。


确定元素是否在 shadowDOM 中的替代方法

作为@Angel Politis 回答的替代方法,有一种更简单的方法可以确定某个元素是否在某人的 shadowRoot 中:

function isInShadowDOM(el) {
  let ret = false;

  if (el.getRootNode) {
    doc = el.getRootNode();
    ret = (doc !== document);
  }

  return ret;
}

关于javascript - 有没有办法阻止 shadow dom 中的 javascript 访问它之外的 DOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50862305/

相关文章:

javascript - 如何使 dynaTree jQuery 插件中的超链接可点击?

javascript - Polymer:自定义元素不隐藏标记、CSS

javascript - Polymer 2 中的模板,如何获取槽元素的上下文?

javascript - jQuery 附加和前置 div 和点击事件

javascript - 如何解决 NodeJS 和 sqlite-3 中深度嵌套的回调?

javascript - 是否可以使用类似 top.window.name 的东西

javascript - Flash 应用程序在被 JavaScript 替换为另一个 div 后丢失状态

php - 如何使用 CURL 从页面解析实际的 HTML?

javascript - 在 JavaScript 中,为什么我们使用 el = document.createElement() 来创建一个 Element 对象,而不是 el = new Element();

polymer - Polymer 的 shady DOM 与 shadow DOM 有什么区别?