天天看点

JavaScript做浏览器检测

最近看了一些面试题,有些还比较有意思,所以拿出来分享一下

1、最短IE浏览器检测

if(!-[,])//我试了多次,在windows10的ie不行啊
    console.log("这是ie浏览器");   
           

变种 还有

!+[1,]

,这个俄国人打破了,现在只要6 bytes!它利用了IE与标准浏览器在处理数组的toString方法的差异做成的。对于标准游览器,如果数组里面最后一个字符为逗号,JS引擎会自动剔除它。详见这里 恭喜你,Aleko ,你真是我的偶像!

据说之前还有

var ie = !+"\v1";

7个字节的《32 bytes, ehr … 9, ehr … 7!!! to know if your browser is IE》,讲述外国人是如何把IE的判定从32 bytes一步步缩简成7 bytes!的故事 。

2、事件监听区分

IE:

window.attachEvent

非IE:

window.addEventListener

if (window.attachEvent) { 
      window.attachEvent("onload", remove); 
} else if (window.addEventListener) { 
      window.addEventListener("load", remove, false);   
}             
function remove() { 
   var div = document.getElementByIdx_x("divprogressbar"); 
                document.body.removeChild(div); 
} 
//或者也可以用
if (document.all){//IE
    window.attachEvent('onload',remove)
}else{//FireFox
    window.addEventListener('load',remove,false);
} 
           

3、属性检测 document.all 方法

if(document.all){ 
   //IE代码 
}else{ 
  //其他 
} 
           

其实这么做不够,document.all能区分出FireFox,却无法区分Opera,因为Opera支持document.all.

我现在的做法是:

var isIE = document.all && window.external;

Opera不支持window.external,所以这么做就比较保险了。

4、浏览器属性

navigator.userAgent

来检测

function getExplorer() {
    var explorer = window.navigator.userAgent ;
    //ie 
    if (explorer.indexOf("MSIE") >= ) {
        alert("ie");
    }
    //firefox 
    else if (explorer.indexOf("Firefox") >= ) {
        alert("Firefox");
    }
    //Chrome
    else if(explorer.indexOf("Chrome") >= ){
        alert("Chrome");
    }
    //Opera
    else if(explorer.indexOf("Opera") >= ){
        alert("Opera");
    }
    //Safari
    else if(explorer.indexOf("Safari") >= ){
        alert("Safari");
    }
}
           

继续阅读