本文主要提供在IE瀏覽器下檢測ActiveX插件安裝/啟用的狀態。
在一些應用開發中,需要用到一些第三方提供的ActiveX插件,如Flash插件。
為了在未安裝插件的瀏覽器顯示友好的提示,需要用到主動檢測插件的安裝/啟用狀態。
ActiveX插件本質上是一種COM組件,安裝了之后會在注冊表HKEY_CLASSES_ROOT\CLSID目錄下創建一個名稱為控件的CLSID的項,展開這個項,下面還有一個名稱為ProgID的項,它有一個默認值代表控件的名稱。如XML HTTP 6.0的CLSID為:HKEY_CLASSES_ROOT\CLSID\{88d96a0a-f192-11d4-a65f-0040963251e5},progID為:Msxml2.XMLHTTP.6.0。
也可以用ActiveXHelper更加方便的查看CLSID和ProgID:http://www.nirsoft.net/utils/axhelper.html
在一般情況下,可以通過以下代碼檢測插件是否安裝/啟用:
function createActiveX(progId) { try { return new ActiveXObject(progId); } catch(ex) { return null; } } function activeXEnabled(progId) { var obj = createActiveX(progId); return !!obj; } var xmlhttp6Enabled = activeXEnabled("Msxml2.XMLHTTP.6.0"), flashEnabled = activeXEnabled("ShockwaveFlash.ShockwaveFlash");
由於IE9引入了ActiveX篩選功能,同樣也要考慮到非IE瀏覽器訪問情況,所以還要增加一下判斷,把方法調整如下:
function activeXFeature() { if (!window.ActiveXObject) return false; try { if (window.external && external.msActiveXFilteringEnabled && external.msActiveXFilteringEnabled()) return false; } catch(ex) {} return true; } function createActiveX(progId) { if(!activeXFeature()) return null; try { return new ActiveXObject(progId); } catch(ex) { return null; } }
還有一些特殊情況,插件可能沒有progID,這個時候就沒有辦法使用上面的方法進行檢測了,這時候就需要直接創建object標簽。
一般情況下,第三方插件也是直接通過object標簽直接呈現在頁面上的,如下:
<object classid="clsid:88d96a0a-f192-11d4-a65f-0040963251e5" codebase="xx.cab#version=1.1"></object>
其中,codebase為瀏覽器能夠直接識別的安裝包。
很多情況下可能不需要在頁面加載時就呈現這個標簽內容,而且,指定了codebase情況下還要等cab文件下載完才能把網頁呈現出來,非常影響用戶體驗,所以改造為以下方法來進行檢測:
function activeXEnabled(clsid) { var el = document.createElement("div"), result = false, axid = "lwme_ax_" + (+new Date()), axobj; document.body.append(el); el.innerHTML = '<object id="' + axid + '" classid="clsid:' + clsid + '"></object>'; axobj = document.getElementById(axid); result = axobj && axobj.object; document.body.removeChild(el); axobj = null; el = null; return result; }
這樣就可以在必要的時候在頁面上創建object標記來檢測ActiveX插件。