为什么 '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 以便在需要时更容易清理注入的脚本,所以我想我很幸运。
在文章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 以便在需要时更容易清理注入的脚本,所以我想我很幸运。