Internet Explorer 10 的 Metro UI 會封鎖 ActiveX 已經不是新聞了,而 Flash Player 在 IE 的實作方式是 ActiveX ,所以中槍在所難免。MSDN 網站上有詳細說明。但如果是 Flash 的話,有些網站可以顯示,Microsoft 會維護一個清單(Compatibility View List ,簡稱 CVList),指出哪些網站可以在 Metro UI 的 IE10 載入 Flash ,IE10 會自動更新這份清單,網站開發人員也可以主動提交審核(不過條件很嚴格,我想我國大部份有 Flash 的網站都不會通過)。

而實際上,這個功能早在 IE9 就有實作了,也就是「ActiveX 篩選」。Metro UI 的 IE10 會強制打開這個選項,如果到桌面版的 IE10 ,從「工具」功能表裡面也可以打開這個選項,以此在 IE10 桌面版重現這個問題。

一但 ActiveX 篩選打開了,所有的 ActiveX 都會失效,包括 ActiveX 的 XMLHttpRequest 都無法執行(出了 IE6 就請不要用這個)。在 HTML 裡面寫的 <object> 也會直接消失,就算該 Flash 是 YouTube 的內嵌影片。我試了 YouTube 新的 <iframe> 內嵌 code 就可以嵌入了,而且是以 HTML5 Video 來嵌入的。

此外,如果是用程式碼來產生 Flash object ,也會噴錯誤:

var e = document.createElement("object");
e.data = "http://example.com/video.swf";
e.type = "application/x-shockwave-flash"; // Error: SCRIPT5: 存取被拒。

然後程式就停止了。

我的解決方法是乾脆塞 HTML code 進去一個 <div> 讓它 parse ,就不會噴 error 導致程式爆掉了。雖然這樣效能比較差,用 profiler 測得大概是 2 倍慢,但為了讓程式在 IE 可以順利運作,也只好這樣。(jQuery 的 $(html) 可能也辦得到,但基於效能問題,以及只需要 parse 很簡單的 DOM structure ,所以不用 jQuery 的這個 parser)。

至於不是 Flash 的 ActiveX (如網路 ATM 或是網路郵局登入時的 Java 加密程式)能不能透過 CV List 讓 Microsoft 解禁,這我懶得查不清楚,不過這類型的網站還是直接送 HTTP header 告訴 IE10 要切換到桌面版比較好吧(詳見此)。

稍微筆記一下讓路過的同學有個參考。

參考資料: