IE中JS报错KB927917的解决方法

摘要 : JS error in IE solution KB927917

IE中JS报错KB927917的解决方法
在 body 标签内调用 append 方式给 body 增加一个节点,如果此时 body 未加载完,也就是 body 标签还未关闭,IE 将报错:KB927917。
它的发生,是因为某些DOM操作发生在DOM树加载完成之前,比如appendChild
就像下面的代码:
<html>
<head>
</head>
<body>
<div>
<script type="text/javascript">
alert(document.readyState);
var oDiv = document.createElement("DIV");
oDiv.innerHTML = 'test odiv test odiv';
document.body.appendChild(oDiv);
</script>
</div>
</body>
</html>
当解析到DIV时就开始在BODY上appendChild,而这个时候BODY是还没有完全就绪的(It is not fully loaded),文档结构仍在loading和interactive状态之间,于是,便会得到上述错误。当然,该错误目前已确切知道的会存在于IE6和 IE7两个版本中(低于IE6的未进行测试),在IE8中将会得到一个HTML解析错误:
HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)
查了下资料,知道了问题的产生原因:
首先是微软的详细解释:http://support.microsoft.com/kb/927917
最后发现其实微软的MSDN上早已列举了解决办法:
http://blogs.msdn.com/ie/archive/2008/04/23/what-happened-to-operation-aborted.aspx
官方给出的解决办法如下:
Moving your script execution to a function that is invoked after parsing is complete (e.g., onload)
Adding the defer boolean attribute to the script block (this defers execution of the script content until parsing is complete)
Limiting your tree modifications to the script-element's immediate parent
Moving the location of your script block to a child of the body (this usually solves most problems, while allowing the most flexibility in terms of scenarios).
1.要解决这个问题,可以进行document.readyState状态判断,当它为complete时再进行相应的操作,或者给script标签加上defer属性(该属性在IE8中已不获支持)。

2.或者

js中加入了 setTimeout("XXXX()",1000);,使其获得足够的加载时间后执行目标(XXXX)的function,于是问题得到解决
引起该问题的代码:
<ul id="header_userinfo">
<li><script type="text/javascript">GetLoginInfo(location.href)</script></li>
</ul>
解决方法:
<ul id="header_userinfo">
<li><script type="text/javascript">$(document).ready(function() { GetLoginInfo(location.href); });</script></li>
</ul>
当然前提下是引用http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js
上一篇 :C#获取Rss资源
下一篇 :javascript中ScrollPic未定义的解决办法