为什么 'inject with insertBefore avoid appendChild errors'?

Why 'inject with insertBefore avoid appendChild errors'?

在文章How, When, And Why Script Loaders Are Appropriate上,我发现了以下没有明确解释的评论:

// Very simple asynchronous script-loader

// Create a new script element
var script      = document.createElement('script');

// Find an existing script element on the page (usually the one this code is in)
var firstScript = document.getElementsByTagName('script')[0];

// Set the location of the script
script.src      = "http://example.com/myscript.min.js";

// Inject with insertBefore to avoid appendChild errors
firstScript.parentNode.insertBefore( script, firstScript );

他们使用 insertBefore 而不是 appendChild 避免了哪些错误?

为什么 appendChild 会导致任何错误?

看起来是针对 IE6 的一个 bug,并且为了避免缺少 head 标签的问题。

对脚本注入技术的很好描述以及一些历史和背景:http://www.stevesouders.com/blog/2010/05/11/appendchild-vs-insertbefore/

具体这个问题:https://bugs.jquery.com/ticket/2709

head = document.getElementsByTagName ("head")[0] || 
    document.documentElement;
// Use insertBefore instead of appendChild to circumvent an IE6 bug.
// This arises when a base node is used (#2709 and #4378).
head.insertBefore(script, head.firstChild);

顺便说一句,我不得不在 IE6 支持方面做很多工作,而且我从来没有遇到过这个问题。我出于其他原因避免使用 head 标签并使用 insertBefore 以便在需要时更容易清理注入的脚本,所以我想我很幸运。