從微軟給IE打上SP2以後,當IE在開啟一些含有ActiveX控制項的網頁是,不再像以前那樣,彈出提示框,讓使用者選擇是否安裝控制項;現在預設情況下給隱藏起來,普通使用者根本不知道是怎麼回事。公司產品同樣也遇到這樣的問題,唯一的辦法就是將控制項做成一個exe檔案,供使用者下載手動安裝註冊;這樣就需要做一個檢測,檢測要是使用者沒有安裝控制項的話就提示使用者使用者下載安裝,要是安裝了就直接轉到相關頁面。想了很多辦法,最後找到一種比較合理的解決方式。由於我們現在經常使用的ajax技術,它實際上就是一種com組件,通過介面實現發送請求和擷取資料,那麼我們要使用ajax,就必定要建立這樣一個com組件,所以我們可以從這裡入手來解決檢測普通控制項是否被攔截的問題。
javascript建立ActiveX控制項方式如下:
function DetectActiveX()
{
try
{
var comActiveX = new ActiveXObject(控制項名稱);
}
catch(e)
{
return false;
}
return true;
}
只要控制項已經安裝,那麼建立肯定會成功(如果IE設定為禁用ActiveX則會失敗),如果控制項沒有安裝則會失敗。這是一種簡單的檢測方式。那麼控制項名稱怎麼知道呢?大家在寫一個com組件的時候,都有一個對應的CLSID。開啟自己的註冊表(自己系統中已經安裝了控制項),在HKEY_CLASSESS_ROOT中尋找,輸入控制項對應的CLSID,會在該目錄下的一個叫CLSID的目錄中找到對應控制項的註冊資訊,開啟該節點,其中有一項是ProgID,其對應的值就是建立該控制項時所要用的名稱,這樣你就可以方便建立和檢測你自己所設計的控制項了。
由於IE不允許javascript訪問系統功能,所以我們不能夠對IE的相關設定做一個直接的訪問,那麼根據我們上面的檢測試試,我們可以輕鬆的判定IE是否禁止運行ActiveX控制項,這也是非常有用的一點,因為很多提示我們可能要提示使用者由於什麼什麼原因,而導致不能使用某項ActiveX控制項的功能。那麼我們如何來進行判斷呢,還記得我剛開始提到的ajax這個東西吧,這個東西不僅能帶來更好的使用者互動功能,同時也能夠用在我們檢測瀏覽器是否禁止運行ActiveX 控制項目的上來。因為ajax是由相關的com組件支援,不管是IE,Firefox,Netscape,Opera等其他瀏覽器,都有相應的實現,因為了是瀏覽器的標準。所以我們只要寫一個通用的,支援各種瀏覽器建立ajax 所要用到的xmlhttp對象即可,如果能建立成功,那麼證明IE一切OK,如果不成功則給出提示,其檢測函數相信大家已經再熟悉不過了,只不過我們現在的目的不一樣了,呵呵。
function DisActiveX()
{
//xmlhttp對象
var kXmlHttp = null;
try
{
//非微軟IE支援的xmlhttp對象
if (typeof XMLHttpRequest != "undefined")
{
kXmlHttp = new XMLHttpRequest();
return true;
}
}
catch(e)
{ }
//微軟IE支援的xmlhttp對象
var aVersionhs = ["MSXML2.XMLHttp.5.0",
"MSXML2.XMLHttp.4.0",
"MSXML2.XMLHttp.3.0",
"MSXML2.XMLHttp",
"Microsoft.XMLHttp"];
//IE建立方式
for (var i = 0; i < aVersionhs.length; i++)
{
try
{
kXmlHttp = new ActiveXObject(aVersionhs[i]);
return true;
}
catch(e)
{ }
}
return false;
}