我正在通过ajax加载HTML部分。该部分通过在现有节点上使用innerHTML
附加到DOM。未直接加载脚本
的部分包含在底部的一些脚本标签,是这样的:
<script src="/Scripts/Griffin.Editor.js" type="text/javascript"></script>
<script type="text/javascript">
marked.setOptions({
renderer: new marked.Renderer(),
gfm: true,
tables: true,
breaks: false,
pedantic: false,
sanitize: true,
smartLists: true,
smartypants: false
});
var textParser = {
parse: function (text) {
return marked(text);
}
}
var prismHighlighter = {
highlight: function (blockElements, inlineElements) {
blockElements.forEach(function(item) {
Prism.highlightElement(item);
});
}
};
var editor = new Griffin.Editor('editor', textParser);
editor.syntaxHighlighter = prismHighlighter;
editor.preview();
</script>
但是,作为脚本标签不执行,我遍历加载部分,以确定所有的脚本标记。然后,我在DOM中创建新的脚本节点并将它们附加到HEAD
。
喜欢的东西:
var scripts = viewElem.getElementsByTagName('script');
for (let i = 0; i < len; i++) {
var scriptTag = scripts[0];
let node = document.createElement('script');
if (scriptTag.src && scriptTag.src.length > 0) {
node.src = scriptTag.src;
node.type = scriptTag.type;
} else {
node.text = scriptTag.text;
node.type = scriptTag.type;
//had eval here before (instead of attaching the embedded script to the HEAD).
}
document.head.appendChild(node);
scriptTag.parentNode.remove(scriptTag);
}
从我的理解调用嵌入脚本之前,浏览器应该加载引用的脚本。然而,我不是这种情况,因为JS控制台抱怨没有找到依赖脚本中定义的对象。
如果我使用一个计时器并评估嵌入式脚本中的一切工作。但这似乎是一个丑陋的解决方法,我真的很想了解加载行为背后的机制(即为什么当部分附加到DOM时不执行脚本,以及为什么在将节点添加到HEAD
标签)。
是否包含脚本文件撰写或其他内联唯一的代码?你也立即删除脚本,也许还有一些需要 – mplungjan
可能是一些脚本文件依赖于其他脚本文件加载的问题。你应该检查这个答案。 [链接](http://stackoverflow.com/a/29250976/1577396) –
@mplungjan:我添加了真正的脚本 – jgauffin