今天调试一段JS代码出现这样的情况:在火狐、IE6/IE7和谷歌浏览器下都正常,但在IE8下运行却没有完全加载整个页面,
并出现了下面的网页错误详细信息:
用户代理: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET4.0C; Alexa Toolbar)
时间戳: Wed, 28 Mar 2012 00:33:23 UTC消息: HTML Parsing Error: Unable to modify the parent container element before the child element is closed (KB927917)
行: 0
字符: 0
代码: 0
URI: http://www.35phone.com/flow.php?step=checkout
郁闷,在网上搜索了一下相关资料,一般说法都是说所指定的标签没有加载完就调用了该对象….
现普遍的背景情况是:
1.页面A通过iframe引入页面B
2.页面B通过document.write()方法加载js文件a.js
3.页面B底部调用a.js中的函数func进行初始化,并调用appendChild函数操作父页面A
网上提供的分析解决办法:
原因:因为某些DOM操作发生在DOM树加载完成之前,比如appendChild
问题定位:页面B还没有加载完a.js文件时,操作了父页面A
解决办法:更改初始化方法为setTimeout(func, 0);
我自己查看了下引起该问题的代码:
<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>
推荐比较简单的解决方法:
将JavaScript代码或引用的JS文件放入页面底部的body标签之后,这样代码在</body>被解释之后执行,就不会出现这个错误了。
DatePicker控件目前会有此问题。
另外,再提供彻底解决针对IE8这个Bug问题的方法:
安装IE8的KB2416400补丁,重启,OK!
KB2416400下载:
http://www.microsoft.com/downloads/zh-cn/results.aspx?freetext=KB2416400&displaylang=zh&stype=s_basic
根据系统和IE版本进行下载即可!
评论