Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8731
  • 博文数量: 9
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 70
  • 用 户 组: 普通用户
  • 注册时间: 2017-11-14 11:21
文章分类
文章存档

2019年(4)

2018年(5)

我的朋友

分类: 架构设计与优化

2018-11-12 18:39:33

  上海宝付分享两种检测IE浏览器的代码。最近使用了ES6的一些特性,然后因为要兼容IE浏览器,比如promise和fetch等,我引入了一个polyfill.js,然后我使用特性来检测IE浏览器的版本。但由于polyfill.js修复了IE的这些缺陷特性,使得我无法得到正确的IE版本。本文分享另外两种检测IE浏览器的代码。

  解决方法

  我找到了微软官网的一篇博客,里面提供了通过IE的UA来判断浏览器的版本,虽然jQuery已经不推荐这种方法来检测,因为各个浏览器的厂商会自定义UA,加上IE有各种兼容模式,得到的版本不一定是正确的。但不妨碍我们使用它。代码如下:

  function getInternetExplorerVersion() {

  var rv = -1; // Return value assumes failure.

  if (navigator.appName == 'Microsoft Internet Explorer') {

  var ua = navigator.userAgent;

  var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");

  if (re.exec(ua) != null)

  rv = parseFloat(RegExp.$1);

  }

  return rv;

  }

  function checkVersion() {

  var msg = "You're not using Windows Internet Explorer.";

  var ver = getInternetExplorerVersion();

  if (ver > -1) {

  if (ver >= 8.0)

  msg = "You're using a recent copy of Windows Internet Explorer."

  else

  msg = "You should upgrade your copy of Windows Internet Explorer.";

  }

  alert(msg);

  }

  由于我只需要检测IE8及其以下的版本,所以我不需要去考虑IE11的UA跟上面不同的情况。所以我的代码是:

  var ie = navigator.userAgent.indexOf('MSIE') > -1;

  var ie8 = ie && getInternetExplorerVersion()<9;

  一行代码

  网上找到一行代码就能够判断IE的版本,其实也是由上面这个函数改写为正则。代码如下:·

  var isIE = +(navigator.userAgent.match(/MSIE (\d+)/) && RegExp.$1);

  然后就可以使用判断if(isIE){} 或者 if(isIE===6){}。

  但是,以上代码并不能识别 IE11 及以上版本,因为 IE11 修改了 userAgent 字符串,不再包含MSIE的标识。IE11 感觉自己高大上了,不能再和你们这群奇模怪样的 IE6-10 混了,加上了 like Gecko 标识,想要蒙混过关。

  // IE 10 userAgent

  "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.3; WOW64; Trident/6.0)"

  // IE 11 userAgent

  "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko"

  // FireFox userAgent

  "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0"

  // Chrome userAgent

  "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36"

  IE11 为了使自己更像一款现代浏览器,支持现行标准,丢掉包袱(查看 IE11 中的兼容性更改),使用老的特性检测或者老的代理字符串检测方式已经不能区分出 IE11 了,成功跻身到高富帅行列。

  但是,IE11 虽然是 IE 家族中的高富帅,其余屌丝也得照顾,所以document.documentMode是万万不能丢的。这个 IE 独有的属性为我们提供了简便可靠的识别。因为document.documentMode本身就是标识 IE 浏览器文档模式的,所以不属于功能特性。

  最终判断 IE 的代码:

  //code from

  var isIE = document.documentMode || +(navigator.userAgent.match(/MSIE (\d+)/) && RegExp.$1)

  条件检测

  之前的JavaScript判断IE浏览器版本IE6,IE7,IE8,里面也分享了条件检测IE版本的。但运行之后却发现不行,后来我调整了一下代码,发现IE返回的innerHTML为字符串,而不是数字。而原来的代码却是数字,所以导致没有检测到,网上的代码很多是错误写法,就是b.innerHTML ===1,然后innerHTML要等于 '1' 才行,调整后的代码为:

  var isIE = function(ver){

  ver = ver || '';

  var b = document.createElement('b')

  b.innerHTML = ''

  return b.innerHTML === '1'

  }

  if(isIE(6)){

  // IE 6

  }

  // ...

  if(isIE(9)){

  // IE 9

  }

  在网上找到跟上面类似的一段代码,大家也可以看看:

  var _IE = (function(){

  var v = 3, div = document.createElement('div'), all = div.getElementsByTagName('i');

  while (

  div.innerHTML = '',

  all[0]

  );

  return v > 4 ? v : false ;

  }());

  if(_IE && _IE<9){

  alert('ie8');

  }

  上海宝付提醒上面的这个_IE会在IE浏览器中返回IE的版本,大家可以根据返回的数字来做判断。

阅读(467) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~