在shadow DOM中执行JS

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中执行?(没有跨域的东西。)

Abh*_*nav 4

这个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 中,脚本执行也应该可以正常工作。