Gáb*_*mre 5 javascript shadow-dom
我正在构建一个模块化的网络应用程序,其中要处理各种用户创建的模型。Shadow DOM 是一个明显的选择,但我不明白 JS 如何在 Shadow DOM 中执行。
我有一个 HTML 内容要使用以下虚拟脚本加载。
<h1>Nice header</h1>
<script type="text/javascript">
console.log('hello')
alert('hi');
</script>
Run Code Online (Sandbox Code Playgroud)
我使用之前的脚本加载页面,如下所示:
<div id="shadow-target"></div>
<div id="non-shadow-target"></div>
<script>
// Called on btn click
loadShadow = function(module) {
var root = document.querySelector('#shadow-target').createShadowRoot();
var lighttarget = document.querySelector('#non-shadow-target');
$.get('whatever.html', function (data) {
alert(data);
$(root).append(data); // Nothing executed
$(lighttarget).append(data); // Works fine
// The header appears in both cases
});
}
</script>
Run Code Online (Sandbox Code Playgroud)
正如评论所说,当内容插入到影子 DOM 根时,JS 不会被执行。标头在两种情况下都会出现,但脚本仅在 light DOM 中执行。这是为什么?自定义JS如何在shadow DOM中执行?(没有跨域的东西。)
这个jsfiddle验证当您使用纯 JS时脚本执行确实可以在 Shadow dom 内运行。因此,在脚本执行方面,我没有看到 Shadow 和Light dom 之间的差异。
但是,如果我使用 jQuery,当我将 html 附加到影子根时,它似乎会忽略脚本标签。这也是一个jsfiddle。这似乎是 jquery 的一个错误,它重新定位脚本标签,与 Shadow dom 相结合,扰乱了脚本的执行。这是尝试解释此行为的少数链接之一。
所以不要使用
$(root).append(clone2);
Run Code Online (Sandbox Code Playgroud)
使用
root.appendChild(clone2);
Run Code Online (Sandbox Code Playgroud)
即使在 Shadow dom 中,脚本执行也应该可以正常工作。
| 归档时间: |
|
| 查看次数: |
3943 次 |
| 最近记录: |