惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
SecWiki News
SecWiki News
Project Zero
Project Zero
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
P
Privacy International News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Scott Helme
Scott Helme
A
Arctic Wolf
Security Latest
Security Latest
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
P
Privacy & Cybersecurity Law Blog
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
The Hacker News
The Hacker News
T
Tenable Blog
雷峰网
雷峰网
有赞技术团队
有赞技术团队
V
V2EX
C
CXSECURITY Database RSS Feed - CXSecurity.com
T
Threat Research - Cisco Blogs
T
Threatpost
AWS News Blog
AWS News Blog
L
LINUX DO - 热门话题
Application and Cybersecurity Blog
Application and Cybersecurity Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
S
SegmentFault 最新的问题
月光博客
月光博客
Spread Privacy
Spread Privacy
S
Secure Thoughts
宝玉的分享
宝玉的分享
博客园 - 三生石上(FineUI控件)
Forbes - Security
Forbes - Security
T
The Exploit Database - CXSecurity.com
G
GRAHAM CLULEY
The Last Watchdog
The Last Watchdog
Y
Y Combinator Blog
I
Intezer
博客园 - 【当耐特】
B
Blog RSS Feed
Attack and Defense Labs
Attack and Defense Labs
I
InfoQ
博客园 - 叶小钗
Cyberwarzone
Cyberwarzone
V2EX - 技术
V2EX - 技术
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Hugging Face - Blog
Hugging Face - Blog
H
Help Net Security
C
CERT Recently Published Vulnerability Notes

博客园 - PENGHAO-X

indows 8上强制Visual Studio以管理员身份运行 [注意]你的系统中存在这个BUG吗?(正则表达式验证) SQL 2005 except,intersect [收藏 ]针对IE网页浏览器不同版本解释的CSS或javascript .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON Windows 2003 远程桌面连接出错解决办法。(由于协议错误,会话将被中断。请重新连接到远程计算机。) CSS hack:区分IE6,IE7,firefox ListView 中的一个低级 BUG 全国哀悼日 灰色CSS滤镜 将字符串对转换成字典(临时表)的自定义函数(SQL) [转载][收藏][新]正则表达式30分钟入门教程[2007-8-3 V2.21] 获取表中新记录(下一条记录)的主键值的存储过程 .NET 2.0中,配置文件app.config的读写(VS2005,C#) 如何进入程序设计的领域 用ASP设计购物推车 - PENGHAO-X - 博客园 XHTML 1.0 参考 JS代码--HTML自动转为JS代码 - PENGHAO-X - 博客园 文本输入限制 - PENGHAO-X - 博客园 JS代码--选择日期
jQuery中浏览器版本判断的一个BUG,此BUG已影响到jqModal,thickbox等多个jQuery插件的应用
PENGHAO-X · 2009-05-02 · via 博客园 - PENGHAO-X

    今天发现网页中的一个脚本错误,经检查发现是使用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就会被忽略掉。