浏览器兼容处理(HTML注释、CSSHack和JS识别)

前面的话

本文中所有IEx+代表包含x及x以上;IEx-代表包含x及x以下,仅个人习惯。例:IE7+代表IE7、IE8……本文中所有例子全部经过测试,欢迎交流。

HTML识别

条件注释法(IE10+已经不支持条件注释)

【注意】两个–和左中括号[之间不能有空格,否则无效

[1]IE9-(<!–[if IE]><![endif]–>)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> .box{  height: 100px;  width: 100px;  background-color: red; } </style>  </head> <body> <!--[if IE]> <div class="box" id="box"></div> <![endif]--> </body> </html> 

[2]仅单一IE(<!–[if IE 6]><![endif]–>)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> .box{  height: 100px;  width: 100px;  background-color: red; } </style>  </head> <body> <!--[if IE 7]> <div class="box" id="box"></div> <![endif]--> </body> </html> 

[3]大于 gt ||  大于等于 gte || 小于 lt || 小于等于 lte(<!–[if gte IE 8]><![endif]–>)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> .box{  height: 100px;  width: 100px;  background-color: red; } </style>  </head> <body> <!--[if gte IE 7]> <div class="box" id="box"></div> <![endif]--> </body> </html> 

[4]非IE(IE10+也能识别),此处多加的<–>,在IE中被当作内部注释,而在非IE浏览器中会闭合之前的注释(<!–[if !IE]><–><![endif]–>)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> .box{  height: 100px;  width: 100px;  background-color: red; } </style>  </head> <body> <!--[if !IE]><--> <div class="box" id="box"></div> <![endif]--> </body> </html> 

CSS hack

【1】属性前缀法(只有IE支持)

[1]IE6-(下划线、中划线)(_color:blue;-color:blue;)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> .box{  height: 100px;  width: 100px;  _background-color: red; } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

[2]IE7-(星号、加号)(*color:blue;+color:blue;)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> .box{  height: 100px;  width: 100px;  *background-color: red; } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

[3]IE10-(/9)(color:blue/9;)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> .box{  height: 100px;  width: 100px;  background-color: red/9; } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

[4]IE8+(/0)(color:blue/0;)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> .box{  height: 100px;  width: 100px;  background-color: red/0; } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

[5]IE9、IE10(/9/0)(color:blue/9/0;)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> .box{  height: 100px;  width: 100px;  background-color: red/9/0; } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

【2】选择器前缀法

[1]IE6-(*html)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> *html .box{  height: 100px;  width: 100px;  background-color: red; } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

[2]IE7(*+html)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> *+html .box{  height: 100px;  width: 100px;  background-color: red; } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

[3]IE8(@media /0)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> @media /0{  .box{   height: 100px;   width: 100px;   background-color: red;  } } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

[4]IE9+及其他非IE浏览器(:root)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> :root .box{  height: 100px;  width: 100px;  background-color: red; } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

[5]firefox(x:-moz-any-link,)

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> x:-moz-any-link,.box{  height: 100px;  width: 100px;  background-color: red; } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

[6]chrome、safari、opera(@media screen and (-webkit-min-device-pixel-ratio:0))

<!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8">  <title>Document</title> <style> @media screen and (-webkit-min-device-pixel-ratio:0) {  .box{   height: 100px;   width: 100px;   background-color: red;  }  } </style>  </head> <body> <div class="box" id="box"></div> </body> </html> 

JS识别

【1】能力检测

【补充1】使用JS能力检测的注意事项,以检测sort排序为例

function isSortable(object){     return !!object.sort; }

上面这个函数通过检测对象是否存在sort()方法,来确定对象是否支持排序。但问题是任何包含sort属性的对象也会返回true

var result = isSortable({sort:true});

检测某个属性是否存在并不能确定对象是否支持排序,更好的方式是检测sort是不是一个函数

function isSortable(object){     return typeof object.sort == "function"; }     //上面的typeof操作符用于确定sort的确是一个函数,因此可以调用它对数据进行排序

【补充2】

[BUG]在IE中typeof xhr.open会返回"unkown"

if(window.ActiveXObject){     var xhr = new ActiveXObject("Microsoft.XMLHttp");     alert(typeof xhr.open)     }

[解决]在浏览器环境下测试任何对象的某个特性是否存在使用下面这个函数

function isHostMethod(object,property){     var t = typeof object[property];     return t == "function" || (!!(t == "object" && object[property])) || t== "unknown"; }    

[1]IE8-(document.createElement)

IE8-的宿主对象是通过COM而非JScript实现的。因此,document.createElement()函数确实是一个COM对象,所以typeof才会返回"Object"

if(typeof document.createElement == "Object"){         alert(1)     }

[2]IE10-(document.all)

if(document.all){         alert(1)     }

[3]IE10-(activeXObject)

if(window.ActiveXObject){         alert(1)     }

[4]chrome、opera(chrome)

if(window.chrome){         alert(1)     }

【2】userAgent

[1]IE

function isIE(){  var ua = navigator.userAgent;  //检测Trident引擎,IE8+  if(/Trident/.test(ua)){   //IE11+   if(/rv:(/d+)/.test(ua)){    return RegExp["$1"];   }    //IE8-IE10    if(/MSIE (/d+)/.test(ua)){    return RegExp["$1"];   }    }  //检测IE标识,IE7-  if(/MSIE (/d+)/.test(ua)){   return RegExp["$1"];  }  } console.log(isIE());//只有IE会返回版本号,其他浏览器都返回undefined 

[2]chrome

function isChrome(){  var ua = navigator.userAgent;  //先排除opera,因为opera只是在chrome的userAgent后加入了自己的标识  if(!/OPR/.test(ua)){   if(/Chrome//(/S+)/.test(ua)){    return RegExp["$1"];   }  }  } console.log(isChrome());//只有Chrome会返回版本号,其他浏览器都返回undefined 

[3]safari

function isSafari(){  var ua = navigator.userAgent;  //先排除opera  if(!/OPR/.test(ua)){   //检测出chrome和safari浏览器   if(/Safari/.test(ua)){    //检测出safari    if(/Version//(/S+)/.test(ua)){     return RegExp["$1"];    }     }  }  } console.log(isSafari());//只有safari会返回版本号,其他浏览器都返回undefined  

[4]firefox

function isFireFox(){     if(/Firefox//(/S+)/.test(navigator.userAgent)){         return RegExp["$1"];     }     } console.log(isFireFox());//只有firefox会返回版本号,其他浏览器都返回undefined

[5]opera

function isOpera(){     var ua = navigator.userAgent;     if(/OPR//(/S+)/.test(ua)){         return RegExp["$1"];     }     } console.log(isOpera());//只有opera会返回版本号,其他浏览器都返回undefined

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 浏览器兼容处理(HTML注释、CSSHack和JS识别)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址