今天发现网页中的一个脚本错误,经检查发现是使用jQuery.browser.version判断浏览器版本时将IE8.0返回成IE6.0了,网上搜索有同样的问题,但大部份人反映的结果都是正常的,再一测试原来问题了,因为我的测试环境是WIN2008(Windows NT 6.0),WIN2003或WINXP返回的结果都是正常的(Windows NT 5.2),查jQuery的源码时发现他是使用正则判断的version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1] ,应该是他把navigator.userAgent中的Windows NT 6.0 解析成IE6.0的版本号了

问题找到了,那么就要找解决方法了。最直接的解决方法是修改jQuery的版本解析正则。由于考虑到如果升级jQuery时每次都要修改很麻烦,再一个jQuery最新版1.3.2的文档中已经声明jQuery.browser及jQuery.browser.version建议弃用,可以使用jQuery.support来代替,这也就是说后续版本中可能会放弃jQuery.browser了。

我的页面中使用jQuery.browser.version的目的是检测IE6,那么另一解决方案就是使用jQuery.support来代替了,查jQuery.support的属性说明中有boxModel可以检测出IE6,boxModel的具体说明如下:

boxModel: 如果这个页面和浏览器是以W3C CSS盒式模型来渲染的,则等于true。通常在IE 6和IE 7的怪癖模式中这个值是false。在document准备就绪前,这个值是null。

但经我测试IE6/IE7/IE8中返回的都是true,这个就是文档中的说明错误了(测试环境:WIN2003+IE6、WIN2003+IE7、WIN2008+IE8,全部为不同的机器)。那现在只好测试其它的属性了,但我把jQuery.support中其它的属性全部测试后都发现没有一个能直接检测出IE6的。Google了一下都是说用jQuery.browser.version来检测。这个在Windows6.0中是行不能的。难道没有其它解决办法了吗?仔细一想刚才在测试jQuery.support的属性时发现jQuery.support.style在IE6/IE7中返回false,只有IE8中返回true,这样我就可以间接地来检测IE6了,具体方法是:
$.browser.msie&&($.browser.version == "6.0")&&!$.support.style 
因为jquery.browser.version能正常检测IE6和IE7,再结合!$.support.style就是IE6了。

最后这个问题也算是解决了,但还不是很完美,毕竟jquery.browser可能会被弃用,不过我想既然这是BUG,jQuery最终还是会解决的。希望园子里的朋友能提出更好的解决方案

补充说明上面说的jQuery.browser.version正则中6.0匹配的是Windows 6.0 是错误的,经测试真正的原因是由于Windows系统版本不同navigator.userAgent返回的值也有一定区别,从下面的值可以看出如下:

WIN2003+IE7 navigator.userAgent返回值:
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

WIN2008+IE8 navigator.userAgent返回值:
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; GTB6; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.5.21022; CIBA; .NET CLR 3.5.30729; .NET CLR 3.0.30618)

修正的正则是这样的,version: (userAgent.match( /(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1] 只要去掉前面的.+就行了,从上面的值可以看现WIN2008中的navigator.userAgent的返回值中前面的compatible; MSIE 8.0是真正的浏览器版本,面后面又加了一个compatible; MSIE 6.0(不清楚这个是作什么用的,应该IE7同样会有这个),而match正则匹配是如果加了.+(即匹配任何字符)前面的那个compatible; MSIE 7.0就会被忽略掉。

转载于:https://www.cnblogs.com/Dove/archive/2009/05/02/1447771.html

jQuery中浏览器版本判断的一个BUG,此BUG已影响到jqModal,thickbox等多个jQuery插件的应用...相关推荐

  1. 原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari(亲测可用)

    浏览器类型及版本判断在开发中是比较常见的使用场景,之前用var ua = navigator.userAgent.toLowerCase()来判断浏览器的内核,发现chrome和edge浏览器无法区分 ...

  2. [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器...

    [完美]原生JS获取浏览器版本判断--支持Edge,IE,Chrome,Firefox,Opera,Safari,以及各种使用Chrome和IE混合内核的浏览器 原文:[完美]原生JS获取浏览器版本判 ...

  3. IE浏览器版本判断之 Trident (排版引擎)

    最近因为项目需要,发现IE 8及其以下版本对下拉框的兼容性不是很好,有时会因为下拉框文字太多而显示不全,但是IE9.10却没有以上问题.又由于IE浏览器自己的"浏览器模式"和&qu ...

  4. 修改webbrower中浏览器版本

    delphi或c#的原生webbrowser控件 默认浏览器的版本很低,现在很多网站已不支持,要么界面显示有问题,要么干脆点不动. 以下方法用于修改webbrower中浏览器的方法 1.cmd   r ...

  5. jQuery浏览器版本判断

    jQuery 浏览器判断,jQuery提供了一个 jQuery.browser 方法 来判断浏览器 可用值: safari   opera   msie   mozilla 例如: if($.brow ...

  6. 使用jquery中$.each()方法来循环一个数据列表

    定义和用法 jQuery.each() 函数用于遍历指定的对象和数组. 语法 $.each( object, callback ) 参数 描述 object Object类型 指定需要遍历的对象或数组 ...

  7. 手机端判断用户代理,浏览器版本,内核信息等

    <script type="text/javascript">//判断访问终端var browser={versions:function(){var u = navi ...

  8. jquery中Live方法不可用,Jquery中Live方法失效

    jquery中Live方法不可用,Jquery中Live方法失效 >>>>>>>>>>>>>>>>> ...

  9. 浅析jQuery原理并仿写封装一个自己的库

    [前言]最近项目忙的脚不沾地,刚刚结束,准备整理一下以前写的一些学习笔记和技术文章.本文原是很久之前看jq源码时写的片段,隔了很久再看都忘得差不多了.简单整理出来,做个记录. 作为一名前端工程师,jQ ...

  10. jq获取页面高度_使用jquery中height()方法获取各种高度

    $(window).height(); //浏览器当前窗口可视区域高度 $(document).height(); //浏览器当前窗口文档的高度 $(document.body).height();/ ...

最新文章

  1. tableview下拉刷新
  2. 用Python建设企业认证和权限控制平台
  3. ubuntu清除无效的右键打开方式
  4. 计算机操作系统生产者和消费者模型的简单介绍
  5. 让数据大白于天下:GCC插件实现代码分析和安全审计
  6. ElasticSearch.js源码走一个大概
  7. vue 路由参数变化,页面不刷新(数据不更新)解决方法
  8. matlab练习程序(Prim最小生成树)
  9. python怎么弄成黑色背景图片_怎么能把图片的黑色背景改成透明背景
  10. 军用装备产品GJB150A淋雨试验检测机构
  11. 思科笔记-Four,ospf协议实现全网互通,spf算法,简短总结篇
  12. DevExpress 皮肤控件 更换皮肤
  13. python如何读取uni文件_如何在Python中通过HTTP与UniProt交谈?
  14. eNSP不同网段主机互联-static
  15. 什么是MBTI,16种人格类型详解
  16. DPDK系列之三DPDK介绍及简单应用
  17. Object类型转换为Integer:
  18. 维基解密网站网址是什么
  19. 〖产品思维训练白宝书 - 核心竞争力篇⑥〗- 产品经理核心竞争力解读之执行力
  20. Linux操作系统管理公共基础——积累

热门文章

  1. Linux平台kafaka安装及使用
  2. Azure Redis 缓存使用注意事项与排查问题文档整理
  3. Lintcode 730 所有子集的和
  4. 03.学习笔记-Linux下根目录介绍
  5. sendfile()对nginx性能的提升
  6. Xml读取和写入以及新建
  7. 黄聪:解决WordPress的函数mb_strimwidth截断中文产生乱码的问题
  8. Sql Server 2005资源瓶颈监控(二)
  9. Windows Debugging之六
  10. oracle跨库连接查询