這...看到這個題目是否真的有點無語,現在誰有人還用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版本中修複了這個問題,但是上司卻不買賬。他要的是“全相容”,而且你示範的時候出現你的浏覽器可以,他的浏覽器不行的情況這是真的“百口莫辯”啊。
怎麼去解決呢?說起來也是比較簡單的。
- 使用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對象解決。
- 将通過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
}