跨浏览器总结(IE7/IE8/IE9/Safari/Chrome/Firefox)

最近在做项目的升级工作,主要是跨浏览器这块,遇到了一些问题并且做了总结,贴出来与大家分享一下,如果你也遇到类似的问题,希望对你有一定的帮助。闲话少叙,进入正题,按照我总结的顺序来吧。

1、获取浏览器的版本,这个是很重要的,在做这个工作之初我就写好了,因为过程中总有无法兼容的情况,就必须进行浏览器判断:

我封装了一下,并且经过了测试【我这里不考虑IE的兼容模式】,喜欢的朋友可以直接拿走。

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">var BrowserType =  
  2. {  
  3.     IE7: "MSIE 7.0",  
  4.     IE8: "MSIE 8.0",  
  5.     IE9: "MSIE 9.0",  
  6.     IE10: "MSIE 10.0",  
  7.     Chrome: "Chrome",  
  8.     Firefox: "Firefox",  
  9.     Safari: "Safari"  
  10. };  
  11.   
  12. /// <summary>  
  13. /// Get Browser version  
  14. /// </summary>  
  15. function getBrowserVersion()  
  16. {  
  17.     if (navigator.userAgent.indexOf("MSIE 7.0") > 0)  
  18.     {  
  19.         return BrowserType.IE7;  
  20.     }  
  21.     if (navigator.userAgent.indexOf("MSIE 8.0") > 0)  
  22.     {  
  23.         return BrowserType.IE8;  
  24.     }  
  25.     if (navigator.userAgent.indexOf("MSIE 9.0") > 0)  
  26.     {  
  27.         return BrowserType.IE9;  
  28.     }  
  29.     if (navigator.userAgent.indexOf("MSIE 10.0") > 0)  
  30.     {  
  31.         return BrowserType.IE10;  
  32.     }  
  33.     if (navigator.userAgent.indexOf("Firefox") > 0)  
  34.     {  
  35.         return BrowserType.Firefox;  
  36.     }  
  37.     if (navigator.userAgent.indexOf("Chrome") > 0)  
  38.     {  
  39.         return BrowserType.Chrome;  
  40.     }  
  41.     if (navigator.userAgent.indexOf("Safari") > 0)  
  42.     {  
  43.         return BrowserType.Safari;  
  44.     }  
  45. }</span>  

2、关于IFrame的问题,这个在跨浏览器的时候你一定会碰到,这个我也封装了两个function,分享一下:

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">/// <summary>  
  2. /// Get iFrame DOM Function [IE、Firefox]  
  3. /// </summary>  
  4. function getIFrameDOM(id)  
  5. {  
  6.     var iframeObj = null;  
  7.     if (document.getElementById(id) != null)  
  8.     {  
  9.         iframeObj = document.getElementById(id).contentDocument || document.frames[id];  
  10.     }  
  11.     return iframeObj  
  12. }  
  13.   
  14. /// <summary>  
  15. /// Get iFrame Window Function [IE、Firefox]  
  16. /// </summary>  
  17. function getIFrameWindow(id)  
  18. {  
  19.     var iframeWindow = null;  
  20.     if (document.getElementById(id) != null)  
  21.     {  
  22.         iframeWindow = document.getElementById(id).contentWindow || document.frames[id].window;  
  23.     }  
  24.     return iframeWindow;  
  25. }  
  26. </span>  


真正用的多是第二个方法,取iFrame的window,然后调用window下的方法。

3、关于IFrame加载完成的事件判断--之前用的是IE的onreadystatechange

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">if (getBrowserVersion() == BrowserType.IE8 || getBrowserVersion() == BrowserType.IE7)  
  2.         {  
  3.             $('#framePrintMap')[0].onreadystatechange = function ()  
  4.             {  
  5.                 if (this.readyState == 'loaded' || this.readyState == 'complete')  
  6.                 {  
  7.                     var json = jQuery.parseJSON($('#hidDatas').val());  
  8.                     var options = jQuery.parseJSON($('#hidOptions').val());  
  9.                     getIFrameWindow('framePrintMap').initPrintMap(json, options);  
  10.                 }  
  11.             }  
  12.         }  
  13.         else  
  14.         {  
  15.             $('#framePrintMap')[0].onload = function ()  
  16.             {  
  17.                 if (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete')  
  18.                 {  
  19.                     var json = jQuery.parseJSON($('#hidDatas').val());  
  20.                     var options = jQuery.parseJSON($('#hidOptions').val());  
  21.                     getIFrameWindow('framePrintMap').initPrintMap(json, options);  
  22.                 }  
  23.             }  
  24.         }  
  25.         $('#framePrintMap').attr('src''ThematicPrintMap.aspx');</span>  

我详细说下,如果是IE7和IE8,可以用onload事件,但是它没有readyState对象,未加载完成直接调用iFrame里面的方法,报错了;IE9的话这两个分支都可以了,onreadystatechange是只有IE才支持,Safari/Chrome/Safari就只能走onload的分支了,那为什么还加个!readyState?是因为在Firefox里面没有readyState对象,所以只能这样判断。

4、关于Table自动拉伸在跨浏览器的区别:请参见我的另一篇文章Table自动拉伸在Chrome与IE中的区别

5、关于各个浏览器对小数的处理:请参见我的另一篇文章各浏览器对小数处理取整情况的对比

6、关于捕获鼠标位置在个浏览器中的差别:请参见我的另一篇文章JavaScript中鼠标event的位置在各浏览器中的异同

7、Chrome/Safari关于position:absolute的处理与其他浏览器有些不同:IE和Firefox会在父元素的内部,而Chrome/Safari会跑出父元素。

8、IE7与其他浏览器的text-align:center处理不一样:IE7:内部的文本与div都居中,其他浏览器:只是文本居中,div不居中:将td中的内容包在div内部可以解决,td内的div的css为text-align:left,div的css为text-align:center,内部的文本就可以居中了。另一个显示year的title的div也是同样设置就可以了。

9、关于IE7的IE=EmulateIE7与IE=7及真正IE7的区别;请参考“浏览器模式”和“文档模式”之间的区别

10、Chrome/Safari下点击submit提交数据到后台:如果数据量超过512k时会自动截断,把input的type改成hidden就可以了。

11、父容器设置overflow:auto;子元素设置属性position:relative;在ie7中该子元素不随滚动条滚动:给设置了overflow:auto属性的容器也加上position:relative就可以了。

12、Safari下时间Date.Parse时间不准确的问题:【有时候准确,有时候不准确,测试发现到了2034年之后就不准确了】,这个问题真是浏览器内核没有做好,没办法,要兼容它还得想办法:

先将日期转化成自己定制的标准格式:

[html] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">Date.prototype.format = function (format)  
  2. {  
  3.     var o =  
  4.     {  
  5.         "M+": this.getMonth() + 1, // month     
  6.         "d+": this.getDate(), // day     
  7.         "h+": this.getHours(), // hour     
  8.         "m+": this.getMinutes(), // minute     
  9.         "s+": this.getSeconds(), // second     
  10.         "q+": Math.floor((this.getMonth() + 3) / 3), // quarter     
  11.         "S": this.getMilliseconds() // millisecond     
  12.     }  
  13.   
  14.     if (/(y+)/.test(format))  
  15.     {  
  16.         format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));  
  17.     }  
  18.   
  19.     for (var k in o)  
  20.     {  
  21.         if (new RegExp("(" + k + ")").test(format))  
  22.         {  
  23.             format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));  
  24.         }  
  25.     }  
  26.     return format;  
  27. }</span>  

然后解析这个格式的时间就可以了,

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
  1. <span style="font-size:18px;">/// <summary>  
  2.     /// Time format:2011-10-01 00:00:00 *[SQL:120] || 2011/10/01[SQL:111]  
  3.     /// </summary>  
  4.     this.dateFromString = function (str)  
  5.     {  
  6.         var arr = str.split(/[^0-9]/);  
  7.         var curTime = null;  
  8.         if (arr.length == 3)  
  9.         {  
  10.             curTime = new Date(arr[0], arr[1] - 1, arr[2]);  
  11.         }  
  12.         else if (arr.length >= 6)  
  13.         {  
  14.             curTime = new Date(arr[0], arr[1] - 1, arr[2], arr[3], arr[4], arr[5]);  
  15.         }  
  16.         return curTime;  
  17.     }</span>  

这个一般用在将时间绑定到某个元素的扩展属性上,然后用的时候进行解析,div.data('time')。

13、Firefox下不支持嵌套function。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章