Internet Explorer 11 中的一些新特性,包括對WebGL 的支持、預抓取、預渲染、flexbox、mutationobservers 以及其餘一些 Web 標準的支持。可是更有趣的是,雖然被叫爲 Internet Explorer 11,但它已經再也不是 IE 了。不過 Internet Explorer 11 應該是 Internet Explorer 家族最棒的版本。經過最終移除過去一些魔鬼般的錯誤,微軟正在爲你們準備一個真正標準的瀏覽器。javascript
經過下面的介紹能夠解決咱們的系統在IE11下存在的問題。請你們細心閱讀並規範Web代碼以防止系統在IE11下瀏覽發生錯誤。java
1. IE11 邊緣(Edge)模式再也不支持 VBScript數組
從Internet Explorer 11 開始,VBScript被視爲已棄用,不該再用做IE11 的腳本編制語言。IE11 Edge模式中顯示的網頁不會執行VBScript 代碼。瀏覽器
由於IE11 Edge模式再也不支持VBScript,因此網頁中沒法再使用如下API 功能:cookie
a) execScript 函數。app
b) VBArray 對象。ide
c) "text/vbs"和"text/vbscript"MIME類型(如同支持script元素的type值)。函數
解決方案:測試
1. 更新當前依賴於VBScript 的全部頁面以使用JavaScript.flex
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文件的地方,請按照下面步驟操做。
下面是判斷是不是IE瀏覽器的代碼:
HM_IE
= (document.all) ? true : false;
能夠修改成:
HM_IE = (!!window.ActiveXObject || "ActiveXObject"
in window) ? true :false;
下面代碼已經無效,由於在IE11中navigator.product == "Gecko"是正確的return true,IE10及如下版本 return
false。
HM_NS6= (navigator.vendor == ("Netscape6") || navigator.product == ("Gecko"));
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中不用分號是不規範的而且容易形成編譯錯誤。