在边缘浏览器中动态注入JavaScript模块

在边缘浏览器中动态注入JavaScript模块,javascript,microsoft-edge,Javascript,Microsoft Edge,我在这里创建了一个小演示: 但为了防止时间丢失,这里是该页面的JavaScript(它正在构造一个带有“module”类型的脚本标记并将其注入页面): let值=` 让元素=document.createElement(“p”); appendChild(document.createTextNode(“执行的JavaScript”); document.querySelector(“body”).appendChild(元素); `; 让编辑= document.createRange().c

我在这里创建了一个小演示:

但为了防止时间丢失,这里是该页面的JavaScript(它正在构造一个带有“module”类型的脚本标记并将其注入页面):

let值=`
让元素=document.createElement(“p”);
appendChild(document.createTextNode(“执行的JavaScript”);
document.querySelector(“body”).appendChild(元素);
`;
让编辑=
document.createRange().createContextualFragment(值),
body=document.querySelector('body');
body.appendChild(已编译);
工作时,它应该在页面主体中显示“已执行的JavaScript”。这在大多数浏览器中都能正常工作(我承认它在IE中不起作用,因为IE根本不支持模块)

我的问题是,这在Edge中不起作用,即使Edge确实支持JavaScript模块:

Edge似乎不喜欢动态注入模块。是否有一些客户端解决方法?目前,我让它在服务器端检查用户代理中的“边缘”(在这种情况下,我会立即在HTML中呈现模块,而不是使用JavaScript注入模块),但这并不是一个最佳解决方案

如果您想知道,我的用例是预加载一些JavaScript模块,然后在用户第一次与页面交互时将它们注入页面(PageSpeed Insights似乎喜欢这种页面速度优化)

编辑:由于有人询问,以下是边缘版本号信息(来自设置):


它显示了Edge 44和EDGEHTML18。

我试图修改您的代码,它与MS Edge 44版本兼容


演示页
设se=document.createElement('script');
se.setAttribute('type','module');
se.innerHTML='var para=document.createElement(“P”);para.appendChild(document.createTextNode(“执行的JavaScript”);文件。查询选择器(“正文”)。附录(第段);
让body=document.querySelector('body');
正文.附加(se);

Edge的哪个版本Microsoft Edge 44.18362.449.0此版本从何处获得?在最近发布的基于铬的Microsoft Edge之前,Microsoft Edge的上一个版本是
Microsoft Edge 18
。我用Edge设置中版本号的屏幕截图更新了这个问题。明白了,所以它的版本是
18
。我想知道这是否与此版本不支持的
动态导入有关?但是基于铬的
边缘支持动态导入。如果可能的话,我会尝试在基于
铬的
边缘上测试它,就像一个实验。有趣!也许问题在于CreateContexturalFragment和JavaScript模块的组合?或者更一般地说,文档片段和JavaScript模块的组合?我认为Edge会与代码混淆。您已经开始了脚本标记,但没有结束。所以我认为这是问题的原因。嗯,我确实有一个脚本的结束标记(再看一下问题的第五行代码)。我只需要将它分成两个字符串,这样浏览器就不会感到困惑,并认为这是外部脚本标记的结束标记,所以我不认为这可以解释它。请注意,我对多行字符串使用反勾号。Ms edge无法理解它。
let value = `<script type="module">
  let element = document.createElement("p");
  element.appendChild(document.createTextNode("The JavaScript executed."));
  document.querySelector("body").appendChild(element);
</scr` + `ipt>`;
let compiled =
    document.createRange().createContextualFragment(value),
    body = document.querySelector('body');
body.appendChild(compiled);