dart - 如何在 Dart 中以编程方式创建 Shadow DOM?

标签 dart dart-polymer shadow-dom

我正在尝试以 Dart 方式实现以下 JS 代码:

代码取自此处:http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/

<div id="host">Host node</div>
<script>
var root = document.querySelector('#host').createShadowRoot();
root.innerHTML = '<style>' + 
    'button {' + 
      'color: green;' + 
    '}' +
    '</style>' +
    '<content></content>';
</script>

我毫不怀疑在 JS 中它可以正常工作,但在 Dart 中它会失败。 我们知道每个文档只允许使用一个 dart 脚本,因此我被迫将其放置到共享 dart 文件中:

ma​​in.dart

import 'dart:html';
void main() {
  querySelector('#host').createShadowRoot().appendHtml('<style>' +
    'button {' +
      'color: green;' +
    '}' +
    '</style>' +
    '<content></content>');
}

如果我们尝试附加任何其他 html 标签,例如 divul 等,一切正常。然而,在 stylecontent 的情况下,它是不同的。我收到警告:

Removing disallowed element <CONTENT>
Removing disallowed element <STYLE>

请告诉我为什么?

更新:

@GünterZöchbauer 关于将 NodeValidatorBuilder() 传递给 appendHtml() 方法。请看图片: enter image description here

最终结果:

var validator = new NodeValidatorBuilder.common()
  ..allowElement('content', attributes: ['some-attribute', 'some-other'])
  ..allowElement('style');
querySelector('#host').createShadowRoot()
..append(document.body.createFragment('<style>' +
  'button {' +
    'color: green;' +
  '}' +
  '</style>' +
  '<content></content>', validator: validator))
// For illustrative purposes, add the button with some text to test styles
..querySelector('content').append(new ButtonElement()..text = 'Button');

最佳答案

这是 dart:html 中的一些默认 XSS 防护。您需要将 NodeValidator 传递给appendHtml,它指定允许哪些元素和属性。

var validator new NodeValidatorBuilder.common()
  ..allowElement('content', attributes: ['some-attribute', 'some-other'])
  ..allowElement('style');

... .append(document.body.createFragment(
    '...some html...', validator: validator));

关于dart - 如何在 Dart 中以编程方式创建 Shadow DOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29644253/

相关文章:

flutter - TextFormField输入键,在构建过程中调用setState()-错误

dart - 从打包库导入的模型类?

dart - 如何在我的 AngularDart 5 测试中使用 KeyCode 触发 KeyDown 事件?

dart - 使用 path_provider 将下载的文件路径获取到 video_player 时出错

flutter - TabBar Controller 从另一个类更改页面

dart - 将事件从父元素发送到polymer.dart中的子元素

dart - 将标签中的星号设为红色

javascript - 如何与输入字段中浏览器插入的 Shadow DOM 内容进行交互?

python - 如何从 Selenium 处理 Shadow DOM 中的元素

css - 外部样式不会覆盖 Shadow DOM 样式