如何在Dart中以编程方式创建shadow DOM?

时间:2015-04-15 07:37:07

标签: 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文件中:

main.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');

1 个答案:

答案 0 :(得分:2)

这是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));