博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IE6 Hotfix MS-042将导致其Crash!
阅读量:6551 次
发布时间:2019-06-24

本文共 2655 字,大约阅读时间需要 8 分钟。

 近来Test Team和部分Devs发现,在某些时候使用 中的右键菜单会导致IE 6.0(sp1)直接Crash掉。从不同机器上IE不断Crash的情况来看,这应该可以确定是IE的问题,而不是偶然的机器环境导致的问题。虽然没有一个固定的步骤来准确复现这个问题,但是大家还是感觉到这是一个新近才集中出现的问题,因为我们产品中所使用的 创建于2004年11月30日,虽然后来有众多的修改,可是都没有改动及其基本的结构。
    昨天我和同事在为这个Menu继续添加新功能时,发现这个Popup菜单导致IE Crash的问题变得十分频繁,几乎每做8,9步显示菜单的操作就能导致IE 6 Crash。
   
IE-MS042-Crash.png
    // 这样的问题真是让人无法忍受啊!!!
    能搞出: The instruction at "0x4a5b19d6" referenced memory at "0x00000020". The memory could not be "red". 这样的问题,显然已经完全操出了脚本的能力。
    原来引起这个问题的始作俑者居然是IE最近release的一个hotfix,该 本来使用来解决IE非法退出的问题。可是没想到去鬼使神差的影响到了脚本生成Popup窗口的功能。
    虽然没有固定的复现这个问题的步骤,但是下面这个页面还是很容易的在安装了该hotfix的IE上引发Crash:
None.gif
<
html
>
None.gif
<
head
>
ExpandedBlockStart.gif
ContractedBlock.gif    
<
script 
language
="javascript"
>
dot.gif
InBlock.gif    
var  g_popup  =  
null ;
InBlock.gif    
function  ShowPopup(elmt)
ExpandedSubBlockStart.gif
ContractedSubBlock.gif    
dot.gif {
InBlock.gif        g_popup  =  window.createPopup();
InBlock.gif        
var  popBody  =  g_popup.document.body;
InBlock.gif        popBody.innerHTML  =  ' < table style = " text-align: center; height: 100%; border: dotted 1px blue " > '
InBlock.gif             +  ' < tr >< td >< button onclick = " ShowPopup(this) " > Show Popup Window </ button >< br >< br > '
InBlock.gif             +  '蓝色虚线框中是一个Popup Window。 </ td ></ tr ></ table > ';
InBlock.gif        g_popup.show( 100 ,  100 ,  400 ,  200 , elmt );
ExpandedSubBlockEnd.gif    }
ExpandedBlockEnd.gif    
</
script
>
None.gif
</
head
>
None.gif
<
body
>
None.gif    
<
button 
onclick
="ShowPopup(this)"
>Show Popup Window
</
button
>
None.gif
</
body
>
None.gif
</
html
>
    // 保存为*.htm文件就可以了,打开后反复点击第一个"Show Popup Window",大概10次左右就会Crash。
    进一步分析这个问题,再看看下面这两个改进的示例:
ExpandedBlockStart.gif
ContractedBlock.gif
<
script 
language
="javascript"
>
dot.gif
InBlock.gif
var  g_popup  =  
null ;
InBlock.gif
function  ShowPopup(elmt)
ExpandedSubBlockStart.gif
ContractedSubBlock.gif
dot.gif {
InBlock.gif    
if  (  ! g_popup ) g_popup  =  window.createPopup();
InBlock.gif    
var  popBody  =  g_popup.document.body;
InBlock.gif    popBody.innerHTML  =  ' < table style = " text-align: center; height: 100%; border: dotted 1px blue " > '
InBlock.gif         +  ' < tr >< td >< button onclick = " ShowPopup(this) " > Show Popup Window </ button >< br >< br > '
InBlock.gif         +  '蓝色虚线框中是一个Popup Window。 </ td ></ tr ></ table > ';
InBlock.gif    g_popup.show( 100 ,  100 ,  400 ,  200 , elmt );
ExpandedBlockEnd.gif}
None.gif
</
script
>
ExpandedBlockStart.gif
ContractedBlock.gif
<
script 
language
="javascript"
>
dot.gif
InBlock.gif
var  g_popup  =  
null ;
InBlock.gif
function  ShowPopup(elmt)
ExpandedSubBlockStart.gif
ContractedSubBlock.gif
dot.gif {
InBlock.gif    g_popup  =  window.createPopup();
InBlock.gif    
var  popBody  =  g_popup.document.body;
InBlock.gif    popBody.innerHTML  =  ' < table style = " text-align: center; height: 100%; border: dotted 1px blue " > '
InBlock.gif         +  ' < tr >< td > 蓝色虚线框中是一个Popup Window。 </ td ></ tr ></ table > ';
InBlock.gif    g_popup.show( 100 ,  100 ,  400 ,  200 , elmt );
ExpandedBlockEnd.gif}
None.gif
</
script
>
    新的版本在反复点击"Show Popup Window"后不会Crash(至少我点了很久很久没有Crash...)。
    仔细分析,我们可以发现,这个问题应该是IE内存泄露造成的。在第一个改进中,我们缓存了g_popup,反复点击其实只使用了一个popup窗口;而在第二个改进中,我们把从popup窗口内部元素对parent页面函数的引用去掉了。这样一来我们可以很容易的发现出错页面的原因:
反复的生成并丢弃了对parent页面脚本元素有引用关系的popup窗口,就会使IE Crash掉。
    
    那么大概知道了Crash的原因后,可以完全有效的避免这个Crash吗?我认为答案是否定的,因为使用Popup窗口来构成的菜单,不太可能绝对的不去引用Parent页面中的脚本方法,同时也很难有绝对安全的办法来避免产生野popup实例(没有被页面引用的popup,类似野指针概念)。退一万步,就算都避免了,那么这种cut过的popup还有什么实用意义呢?

    除了自己小心,那么最有只能祈祷M$赶快推出新的补丁的补丁的补丁。。。

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

你可能感兴趣的文章
F. Multicolored Markers(数学思维)
查看>>
nodjs html 转 pdf
查看>>
洛谷P1287 盒子与球 数学
查看>>
Bootstrap vs Foundation如何选择靠谱前端框架
查看>>
MD5加密
查看>>
微信,想要说爱你,却没有那么容易!
查看>>
WSDP
查看>>
Memory Management
查看>>
JQUERY 对 表格中的数据重排序
查看>>
awk 常用方法
查看>>
Android网络框架实现之【Retrofit+RxJava】
查看>>
Android文件的加密与解密
查看>>
java笔记:SpringSecurity应用(二)
查看>>
php记录代码执行时间
查看>>
简简单单几段代码让自己变成最合格的网站管理员
查看>>
[置顶] 遵循Java EE标准体系的开源GIS服务平台之二:平台部署
查看>>
Java递归算法——阶乘
查看>>
Multi-voltage和power gating的实现
查看>>
JavaScript面向对象 ~ 原型和继承(1)
查看>>
spring cloud微服务分布式云架构--hystrix的使用
查看>>