非侵入式 “images loading” 自家用的’popUp’
18

单纯从检测浏览器的版本来说, userAgent对IE8已经不再可靠,原因是IE8加入了兼容性视图功能,导致IE8出现多个userAgent。
详细查看gracecode的《由IE8 User-Agent 更新想到的》一文

在ie8下分别用三种”浏览器模式”运行以下代码

    alert(navigator.appVersion)

我在Vista下运行以上代码的结果如下:

可以看出除了IE版本号不一样以外,Trident标识也有区别

那么如何判断IE8,办法还是有的……

功能检测

检测浏览器是否支持IE8特有的WebSlices、Accelerator、Visual Search 功能

function isIE8(){
  return typeof (window.external.AddToFavoritesBar) != "undefined" 
         || typeof (window.external.AddService) != "undefined"
         || typeof (window.external.AddService) != "undefined"
}
try{
  if(isIE8())
    alert('IE8')
  else 
    alert('非IE8浏览器');
 }
 catch(e){
   alert('非IE8浏览器');
 }

对象检测

利用IE8的XDomainRequest对象检测(推荐)

   var isIE8 = !!window.XDomainRequest;

以上两种解决方案现在是可以解决IE8的判断问题,但是也只是向后兼容的解决方案,如果IE发布新的浏览器,以上的方法将不再可靠,到时候还需要userAgent和特性检测相结合的方法。IE真是个让人很头疼的东西~。

延伸

IE,FF,safari,chrome,opera主流浏览器的检测

   ie = '\v'=='v';   
   ie = !!top.execScript;   
   ie = /*@cc_on!@*/!1;   
   ie8 = !!window.XDomainRequest;   
   IEVersion = 0/*@cc_on+ScriptEngineMajorVersion()@*/;   
   ff = /a/[-1]=='a';   
   ff3 = (function  x(){})[-5]=='x';   
   ff2 = (function x(){})[-6]=='x';   
   safari=/a/.__proto__=='//';   
   chrome=/source/.test((/a/.toString+''));   
   opera=/^function \(/.test([].sort);

Leave a Reply

preload preload preload