在Javascript中使用appendChild与IE的兼容性问题

9

我在IE浏览器中遇到了问题(在Chrome浏览器中似乎工作正常):

<html>
<body>
<script type="text/javascript">
    var scriptContent = "var whatever=1";
    var _js = document.createElement('script');
    _js.setAttribute('type', 'text/javascript');
    textNode = document.createTextNode(scriptContent);
    _js.appendChild(textNode);  
    document.getElementsByTagName('body')[0].appendChild(_js);
</script>
</body>
</html>

在Internet Explorer(IE9)中出现的错误是:“对语句“_js.appendChild(textNode)”进行意外调用或访问属性”。是否有任何方法可以解决这个问题?

据我所知,IE9在将appendChild应用于body元素时存在一些问题(我知道你的错误出现在此之前)。理想情况下,您应该将脚本放入head而不是body中。 - Jamie Dixon
2个回答

5
您可以在这里看到,IE中的appendChild()不适用于<script>元素。(似乎IE9支持,但这取决于浏览器模式)
之前有一个正确的答案是由Nivas提供的,不幸的是它已被删除。
在IE中应使用
_js.text = scriptContent; 

3

你的脚本在DOM准备好之前被执行,所以获取<body>标签存在竞争条件。我在Chrome 15和Firefox 8中实际上遇到了相同的错误。

当在页面加载后调用,例如在函数中,你可以看到代码正常工作

HTML

<a href="#" onclick="return append()">append</a>

JavaScript

function append() {
    var scriptContent = "var whatever=1";
    var _js = document.createElement('script');
    _js.setAttribute('type', 'text/javascript');
    textNode = document.createTextNode(scriptContent);
    _js.appendChild(textNode);  
    document.getElementsByTagName('body')[0].appendChild(_js);
    return false;
}

是的,这个问题是关于在IE9中使其工作的,我进行了测试,它可以工作(但我完全同意它取决于哪种浏览模式)。我相信我的答案仍然适用于DOM还没有准备好的部分,因为我在不调用_append_的情况下在不同的浏览器中得到了完全相同的错误。 - andyb
我认为appendChild的问题不在于body,而是在于script标签。 - bart
@andyb:我猜IE9已经被使用了,但是OP希望它也能在早期版本中运行(仍有很多WinXP用户无法使用IE9)。 但当然你的答案仍然有效且不错 :) - Dr.Molle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接