[JavaScript]WebBrowser控件下IE版本的检测
转载请注明原文地址:https://www.cnblogs.com/litou/p/10772272.htm
在客户端检查用户使用的浏览器类型和版本,都是根据navigator.userAgent属性去判断的,虽然说一些自定义的浏览器或者HTTP组件会修改这个属性,但对于一般的情况下是足够的了。一般情况下userAgent值如下:
Chrome:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
FireFox:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0
IE11:Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; LCTE; rv:11.0) like Gecko
IE8:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
有一种特殊的情况,就是使用WebBrowser控件浏览网页,WebBrowser控件是微软提供的对IE内核Trident二次开发的封装,在WebBrowser控件中检测到的userAgent值如下:
IE11下的WebBrowser:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; LCTE)
IE8下的WebBrowser:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
可以发现不管操作系统中是哪个IE版本,userAgent值中都指示IE版本为MSIE 7.0,这会影响检测浏览器版本的正确性。
这个原因是在于WebBrowser控件默认是与运行在IE7的浏览器模式下(https://blogs.msdn.microsoft.com/patricka/2015/01/12/controlling-webbrowser-control-compatibility),如果要修改WebBrowser控件的浏览器模式,需要修改注册表才能实现(https://docs.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/general-info/ee330730(v%3dvs.85))。又或者在HTML的head中指定X-UA-Compatible这个meta,这样WebBrowser控件会强行运行在指定的文档模式中。
这里提到IE的两个概念,浏览器模式和文档模式。
浏览器模式:切换IE针对网页的默认文档模式、对不同版本浏览器的条件备注解析、发送给网站服务器的用户代理(User-Agent)字符串的值。(图1)
文档模式:指定IE的页面排版引擎(Trident)以哪个版本的方式来解析并渲染网页代码。(图2)
简单来说,文档模式决定渲染网页时内核引擎的版本,而浏览器模式影响的是文档模】、8式的默认版本,以及userAgent串的值,所以我们获取到的userAgent串都是浏览器或者WebBrowser控件的浏览器模式值,也就是说,对于一般的浏览器内核、版本,以及操作系统的检测,通过userAgent串是可以区分出来的,但对于WebBrowser控件中的检测不适用。
是不是就没有办法呢?这个是否定的,但可能需要绕个圈。经测试,IE浏览器默认情况下的浏览器模式和文档模式值对应如下:
浏览器模式 | 文档模式 | |||
可选值 | 默认值 | 可选值 | 默认值 | |
IE8 | 8、7 | 8 | 8、7、Quirks | 8 |
IE9 | 9、8、7 | 9 | 9、8、7、Quirks | 9 |
IE10 | 10、9、8、7 | 10 | 标准、9、8、7、5Quirks、Quirks | 标准 |
IE11 | 11、10、9、8、7、6 | 11 | 11、10、9、8、7、5 | 11 |
由于WebBrowser控件的浏览器模式修改修改注册表才能实现修改,这个估计一般很难做到,但是上面提到了,在HTML的head中指定X-UA-Compatible这个meta,这样WebBrowser控件会强行运行在指定的文档模式中,也就是说,我们可以指定X-UA-Compatible的值,然后在文档中通过document.documentMode来读取当前文档模式的值,就可以达到目的。操作步骤如下:
1)HTML页面的head中,在title和所有的meta前,增加meta为<meta http-equiv="X-UA-Compatible" content="IE=edge" />,这样就可以使文档模式运行在最高版本。(文档模式的最高版本与浏览器版本一致)
2)通过document.documentMode属性读取文档模式的值,进而判断出当前IE浏览器的版本
通过测试整理,汇总结果如下:
userAgent | 设置meta后的documentMode值 | |||
原生浏览器 | WebBrowser控件 | 原生浏览器 | WebBrowser控件 | |
IE8 / XP | Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0) | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0) | 8 | 8 |
IE8 / Win7 | Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0) | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0) | 8 | 8 |
IE9 / Win7 x64 | Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0) | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0) | 9 | 9 |
IE10 / Win7 x64 | Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0) | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/6.0) | 10 | 10 |
IE11 / Win7 x64 | Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0) like Gecko | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0) | 11 | 11 |
IE11 / Win10 x64 | Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0) like Gecko | Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.2; WOW64; Trident/7.0) | 11 | 11 |
其实最后发现,userAgent中根据Trident后面的版本号也可以很好的判断出IE浏览器的版本:)
[JavaScript]WebBrowser控件下IE版本的检测的更多相关文章
- 强制IE浏览器或WebBrowser控件使用指定版本显示网页
自从装了IE10之后,就发现好些个网站显示都不是那么的正常,网站上有些功能竟然还会出现一些意想不到的BUG——本来就是针对IE开发的,现在IE下竟然用不起来了,让用户情何以堪?但是就为少量用户使用的系 ...
- 在.net中修改Webbrowser控件的IE版本
根据32位.64位系统来分别修改对应的注册表路径的键值对,不需要重启程序. /// <summary> /// 修改Webbrowser控件模拟的IE版本 /// </summary ...
- delphi强制WebBrowser控件使用指定版本显示网页
function TFrmmain.WriteAppNameToReg:Boolean; var reg:TRegistry; sPath,sAppName:String; Sver:string; ...
- 强制IE浏览器或WebBrowser控件使用指定版本显示网页2
一.问题的提出 偶然发现,Winform里的WebBrowser和IE实际安装的版本似乎并不同步,很有趣! 下面有张图,里面一个窗口是用IE9打开某网站,另一个窗口是用Winform+WebBrows ...
- C# 指定Webbrowser控件所用IE内核版本
如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe,以64位机 ...
- js,onblur后下一个控件获取焦点判断、html当前活跃控件、jquery版本查看、jquery查看浏览器版本、setTimeout&setInterval
需求: input控件在失去焦点后直接做验证,验证通不过的话,显示相应错误.但是如果失去焦点后点击的下个控件是比较特殊的控件(比如,退出系统),那么不执行验证操作,直接退出系统(防止在系统退出前,还显 ...
- VC++使用WebBrowser控件,强制给控件指定版本显示网页
转载:http://www.cnblogs.com/1175429393wljblog/p/5398928.html 最近为了抓取淘宝的成交数据,用C#的WebBrowser控件开发了一个简单的程序. ...
- PB打开ole控件IE浏览器版本问题_指定Webbrowser控件所用IE内核版本(转)
如果电脑上安装了IE8或者之后版本的IE浏览器,Webbrowser控件会使用IE7兼容模式来显示网页内容.解决方法是在注册表中为你的进程指定引用IE的版本号. 比如我的程序叫做a.exe 对于32位 ...
- .net 设置webbrowser控件使用的IE版本
当我们在使用.net的Webbrowser控件时,发现webbrowser展示的内容和我们用浏览器展示的内容不一致,甚至出现:'JSON' is undefined. 原因是webbrowser使用的 ...
随机推荐
- Android源码和内核源码的下载,编译和执行
笔者依据罗升阳老师的<Android 系统源码情景分析>一书,尝试下载,编译和执行Android源码和内核源码.但可能是软件源"被墙"或版本号更新的原因.期间遇到诸多问 ...
- 【Hadoop】Hadoop MR 自定义序列化类
1.基本概念 2.Mapper代码 package com.ares.hadoop.mr.flowsum; import java.io.IOException; import org.apache. ...
- Linux SSH和SFTP服务分离
Linux SSH和SFTP服务分离 学习了:https://www.cnblogs.com/zihanxing/articles/5665383.html 都是监听22端口:
- Android学习(二十一)OptionsMenu选项菜单
一.OptionsMenu选项菜单 在应用程序中点击功能按钮会弹出选项菜单,点击可以实现具体功能. 二.实现思路: 1.创建选项菜单: onCreateOptionsMenu(); 2.设置菜单项可用 ...
- C++11之function模板和bind函数适配器
在C++98中,可以使用函数指针,调用函数,可以参考之前的一篇文章:类的成员函数指针和mem_fun适配器的用法. 简单的函数调用 对于函数: void foo(const string &a ...
- react-native 项目实战 -- 新闻客户端(7) -- 新闻详情页
http://c.3g.163.com/nc/article/BUH64L0J00031H2L/full.html 观察这个地址,BUH64L0J00031H2L 就是每条新闻数据里的postid. ...
- 渐进式 JPEG (Progressive JPEG)来提升用户体验
1.概述 jpg格式分为:Baseline JPEG(标准型)和Progressive JPEG(渐进式).两种格式有相同尺寸以及图像数据,扩展名也是相同的,唯一的区别是二者显示的方式不同. Base ...
- 【优才原创】Android的拖放机制
优才网 [优才原创]Android的拖放机制 2016-04-18 优才学院 优才网 一.拖放机制概述 ² 拖放操作是手指触摸屏幕上的某一对象.然后拖动该对象.最后在屏幕的某个位置释放该对象并运行某种 ...
- iostat命令分析磁盘io
1.安装 yum install sysstat 2.参数 建议将man 文档看一遍 3.简单判断io状况 iostat -d -k 2 -x Device: rrqm/s wrqm/s r/s w/ ...
- iWatch开发:UI 组件说明
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hlbmppZTEyMzQ1Njc4/font/5a6L5L2T/fontsize/400/fill/I0 ...