Internet Explorer 11 中的一些新特性,包括对WebGL 的支持、预抓取、预渲染、flexbox、mutationobservers 以及其他一些 Web 标准的支持。但是更有趣的是,虽然被叫为 Internet Explorer 11,但它已经不再是 IE 了。不过 Internet Explorer 11 应该是 Internet Explorer 家族最棒的版本。通过最终移除过去一些魔鬼般的错误,微软正在为大家准备一个真正标准的浏览器。
通过下面的介绍可以解决我们的系统在IE11下存在的问题。请大家细心阅读并规范Web代码以防止系统在IE11下浏览发生错误。
1. IE11 边缘(Edge)模式不再支持 VBScript
从Internet Explorer 11 开始,VBScript被视为已弃用,不应再用作IE11 的脚本编制语言。IE11 Edge模式中显示的网页不会执行VBScript 代码。
因为IE11 Edge模式不再支持VBScript,所以网页中无法再使用以下API 功能:
a) execScript 函数。
b) VBArray 对象。
c) "text/vbs"和"text/vbscript"MIME类型(如同支持script元素的type值)。
解决方案:
1. 更新当前依赖于VBScript 的所有页面以使用JavaScript.
GTS系列项目用在调用外部dll实现登录或者导出功能的情况下是使用VBScript实现的。为此我该写了自动登录的方法与文件导出时对”Excel.Application”的调用文件export.vbs以适应IE11下的功能实现。
2. export.js文件存放在:L:DaKun Ni export.js
各位同事在实现导出功能的时候可以下载使用或审查纠正。
3. 出于兼容性原因,对于传统文档模式(IE10 标准模式以及更低版本),VBScript 可以执行,在文件头添加<meta
http-equiv="x-ua-compatible" content="IE=10">即可实现。但是这应该被视为一种临时的解决方案。
2. 微软更改了 navigator 对象:
navigator.appName 值为 “Netscape”;IE10及以下版本为:” Microsoft Internet Explorer”
navigator.product 值为 “Gecko”;IE10及以下版本没有该属性。
这或许是一项开发者的诡计,但该行为的确是在HTML5 中实际指定的。在HTML5 中要求这两个属性必须返回上述对应的值,这是一个很奇怪的规定的,更奇怪的是
Internet Explorer 11 遵守了这个规定。
Navigator对象的属性:
appCodeName 与浏览器相关的内部代码名
appMinorVersion 辅版本号
appName 浏览器的正式名称
appVersion 浏览器的版本号
cookieEnabled 支持cookie返回true,否则为false
cpuClass 浏览器正在运行的计算机的cpu型号
language 浏览器支持的语言
mimeTypes 浏览器支持的所有MIME类型的数组
onLine 浏览器当前为在线模式,返回true,否则为false
opsProfile 未定义
oscpu 浏览器正在运行的操作系统
platform 浏览器正在运行的操作平台
plugins 浏览器安装插件的数组
product 浏览器的产品名
productSub 与浏览器产品相关的更多信息
securityPolicy 浏览器支持的加密类型
systemLanguage 操作系统的默认语言
userAgent 包含多项属性中的所有或一部分
userLanguage 用户在自己的系统上设置的语言
userProfile 返回一个UserProfile对象,它存储用户的个人信息
vendor 制作浏览器的公司
vendorSub 关于浏览器制作厂商的更多信息
window对象的navigator属性引用了一个Navigator对象,代表的是浏览器的总体信息,navigator很多时候用来判断浏览器的类型,Navigator对象主要有五个主要属性:appName,appVersion,userAgent,appCodeName,platform,在不同浏览器中输出这些浏览器信息会发现很有有意思的东西。参考文档:http://blog.csdn.net/salonzhou/article/details/6331701
IE11对navigator的更改导致一些根据navigator 对象判断浏览器型号的JavaScript 代码会将Internet Explorer 11 识别成基于Gecko 的浏览器。
3. 更改了 user-agent 字符串
微软移除了Internet Explorer 的一些特性:更改了user-agent 字符串,这使得很多判断浏览器是否IE 的代码无法工作,包括有些JavaScript 的isIE () 的方法在Internet Explorer 11 上执行会返回false。不过好在Internet Explorer 11 对Web 标准的支持非常好,因此不再需要之前那些IE 特定的行为。Internet Explorer 11 中,user-agent比之前的版本要短很多,而且去掉了最关键的MSIE 的关键字:
Internet Explorer 11 的 user-agent:
Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko
Internet Explorer 10 的 user-agent (on Windows 7):
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64;
Trident/6.0)
上述 user-agent 你还会注意到增加了 Gecko 的标识,而 Safari 是首个标注了 Gecko 的浏览器。
之前多数使用 MSIE 来判断是否 IE 浏览器的代码都无法工作,可以改用 Trident 字符串来判断。Trident 标识是在 IE9 中引入的。
4. document.all系列
从 IE4 开始,document.all 在 IE 中举足轻重。比起
document.getElementById () 来说,document.all 是 IE 方式的获取元素的引用的方法。从 IE5 增加对 DOM 的支持, document.all 一直沿用至 IE10,但在 Internet Explorer 11 中 document.all 被设置为返回false这就意味着任何基于document.all的代码分支判断在IE11中将失败,即使代码实际使用document.all能正常工作,但不推荐使用。
另外一个要废弃的是 attachEvent () 方法,该方法用于添加事件处理器,对应的 detachEvent () 用来移除事件处理器。所以在使用attachEvent方法时,不能通过判断浏览器是否是IE来决定是否使用attachEvent方法了,而要使用功能判断。代码如下:
function addEvent(element, type,handler) {
if(element.attachEvent) {
element.attachEvent("on" + type,handler);
}else if(element.addEventListener) {
element.addEventListener(type,handler, false);
}
}
当然,建议你优先使用标准的浏览器进行测试以确保不会因为 attachEvent () 的移除而影响代码执行。不过互联网上充斥着各种糟糕的监测代码,你只能确保自己的应用经过良好的标准测试。
5. 被删除的特性还包括
window.execScript () –IE 版本的 eval ()
window.doScroll () –IE 用来滚动窗口的方式
script.onreadystatechange –IE 方式的脚本加载完成的事件通知
script.readyState –IE 方式的测试脚本是否加载完成的状态
document.selection –IE 方式获取当前选择的文本
document.createStyleSheet –IE 方式创建样式单
style.styleSheet –IE 方式引用样式
所有这些被废弃的方法都有基于标准的替代方法。如果你使用的是标准的方法那恭喜你,可直接支持 Internet Explorer 11。
6. 下面我们来解决存在的问题。
如果你的系统中用到判断浏览器版本的js脚本或者应用vbscript调用外部dll文件的地方,请按照下面步骤操作。
- 1. 在系统Solution中搜索关键字“document.all”进行修改。
下面是判断是否是IE浏览器的代码:
HM_IE
= (document.all) ? true : false;
可以修改为:
HM_IE = (!!window.ActiveXObject || "ActiveXObject"
in window) ? true :false;
- 2. 在系统Solution中搜索 关键字“navigator”检查是否存在问题。
下面代码已经无效,因为在IE11中navigator.product == "Gecko"是正确的return true,IE10及以下版本 return
false。
HM_NS6= (navigator.vendor == ("Netscape6") || navigator.product == ("Gecko"));
- 3. 在系统Solution中搜索 关键字“vbscript”或者“.vbs”进行下面操作:
A)如果你查到的标签是:
<script
language="vbscript" src="../jscript/export.vbs"
>
首先你得找到export.js文件然后把它添加到Project中,把上面的标签修改为<script type="text/javascript"
src="../../Script/export.js"></script>
注意js文件的src属性值。
B)如果查到的标签是:
<script language="vbscript">
call excel_export("DataGrid_AdminAccumulatedStaffAward1_dgAdminAccumulatedStaffAward")
call window.close()
</script>
把上面vbscript代码修改为javascript代码,如下:
<script type="text/javascript">
excel_export('dgLeaveHistory');
window.close();
</script>
C) 如果查到的是excel_export方法的实现,
<script language="vbscript">
Sub excel_export(ByVal tableid)
只需要引用export.js文件然后把原有的vbscript标签删掉就行,不过得确保excel_export方法的名称正确,并确定export.js中有对应的实现(function excel_export);
D)最麻烦的是将vbscript 脚本写到C#代码中,
string sVBScript = "<script
language="vbscript">call
export_to_excel("" + parameter+ "")</script>";
this.ClientScript.RegisterClientScriptBlock(this.GetType(),"", sVBScript);
这种情况得修改C#代码为:
string sVBScript = "<script
type="text/javascript">export_to_excel("" + parameter
+ "");</script>";
this.ClientScript.RegisterClientScriptBlock(this.GetType(),"",
sVBScript);
并且 Rebuile Project 获取最新的dll文件。
在修改vbscript 的时候注意分号的应用,因为在javascript中不用分号是不规范的并且容易造成编译错误。