这...看到这个题目是否真的有点无语,现在谁有人还用IE6啊。是的,自从XP被全面取缔了之后还有谁还用这IE6呢?但是做过政府类或电信类项目的同学们应该都经历过那段痛苦的时光吧,领导一句“全兼容”就足以做死你。

2014、15年是我最最为痛苦的日子,当时作为全栈工程师最烦的就是要做前端的工作了,特别是IE6\7\8\9\10之间的兼容,掉了多少头发。基于某些特殊原因的需要某些企业还是使用的是IE旧版本,但是项目的组件已经跟国际接轨只对新版浏览器兼容。面对这个问题我曾经纯手撸了一个纯JavaScript的前端网站(这做过日企项目的同学们应该深有体会)。

在这个过程中就发现今天要说的这个问题,先不要说大版本跨越时兼容的问题,就是IE6的SP2和SP3之间也会出现问题。

在开发的过程中发现IE6浏览器在通过window.showModalDialog打开窗口后存在新窗口会话丢失的情况。

而且SP2和SP3存在区别,SP3中会话(Session)是可以传入的,但在SP2或SP1版本中会出现会话失效提示。

至于原因嘛,低版本IE6使用window.showModalDialog无法将主窗口中的sessionID传入,从而导致会话丢失在SP3以及后续版本中这个问题已经解决掉了。

虽然微软已经在SP3版本中修复了这个问题,但是领导却不买账。他要的是“全兼容”,而且你演示的时候出现你的浏览器可以,他的浏览器不行的情况这是真的“百口莫辩”啊。

怎么去解决呢?说起来也是比较简单的。


  1. 使用window.showModalDialog时先传入window对象
window.showModalDialog(url,window,"下载","resizable:yes;dialogHeight:1px;dialogWidth:1px;status=no;scroll=yes;");

在子窗口中点击链接会先通过过滤方法来跳转,如下:

function openUrl(urlstr){
var openobj = window;
if(typeof(window.dialogArguments) == 'object'){
openobj = window.dialogArguments;
}
openobj.open(urlstr,"_blank");
}

跳转前先获取传入的主窗口window对象,这个方法可以统一解决IE6这类问题。

注意:我这里说的是“这类”问题,其实类似的问题还有很多,但是可以通过传window对象解决。


  1. 将通过JS脚本获取IE6和其他IE版本
var ua = navigator.userAgent; 
if (ua.indexOf("SV1")!=-1){ //是否ie6
if(ua.indexOf("NT 5.1")!=-1){
// window xp + sp1, sp2
}else if (ua.indexOf("NT 5.2")!=-1){
// windows 2003 + sp1
}else{
//ie6的其他版本
}
}else{
//ie后续版本 ie7,ie8
}

上面第一个判断“SV1”, SV1的本意是"security version 1",它就是用来专门标注使用ie6浏览器的用户使用的操作系统是否是window xp sp2或window server 2003 sp1。我估计现在应该已经没有了这个SV判断了吧。

通过这种方式能够先定位到是那个版本之后再进行适配操作,刚刚也说到了从SP3开始就不再需要特殊处理了,因此判断一下版本还是很有必要的。