淺談瀏覽器插件檢測 和自定義協(xié)議的支持
前一陣子一直在折騰瀏覽器的插件檢測和自定義協(xié)議的支持。
經(jīng)過種種痛苦的折騰,算是對這一領(lǐng)域有了點淺顯的認知。特此記錄一下
一、背景知識
自定義協(xié)議:常用的協(xié)議有 http:// https:// ftp:// 等
然而我們也經(jīng)常會遇到類似這樣的協(xié)議連接
thunder:// 迅雷的
item:// itunes的
ed2k:// 電驢的
這樣的協(xié)議是需要本地計算機安裝軟件與之接應(yīng), 實現(xiàn)相應(yīng)操作的
也就是當你點一個類似的連接,瀏覽器會通知系統(tǒng)以何種程序處理該種協(xié)議的連接,這種對應(yīng)是通過注冊表來實現(xiàn)的
參考資料:http://www.rzrgm.cn/Aricc/archive/2009/03/18/1415929.html
二、實現(xiàn)方案
要定義一個自定義協(xié)議,首先需要你有一款程序與之對應(yīng),
也就是說這個協(xié)議得有軟件去處理,一般會是下載操作。
而自定義協(xié)議連接最終是顯示在網(wǎng)頁上的,最終這是網(wǎng)頁與本地程序之間的交互。
而之間的橋梁就是瀏覽器。
那么要支持一個自定義協(xié)議,還需要去檢測本地是否有支持該協(xié)議的處理程序。
這個能力的檢測是要通過檢測瀏覽器的插件來判斷的。
也就是 裝軟件的時候同時給瀏覽器增加插件,以便標示系統(tǒng)有能力支持協(xié)議。
畫一個流程圖:
發(fā)布軟件 和自定義協(xié)議——》安裝軟件同時給瀏覽器安裝插件———》用腳本檢測瀏覽器插件以判斷支持情況————》點擊自定義協(xié)議連接調(diào)用本地程序處理
三、插件檢測
IE 可以通過嘗試 new ActiveXObject(axname); 操作是否成功來判斷插件存在情況
try {
var obj = new ActiveXObject(axname);
a = true;
} catch (e) {
a = false;
};
return a;
IE的另一種方法是 預(yù)先埋設(shè)一個 object 并查看該object的屬性或者方法來判斷本地是否有能力支持
比如apple itunes的object為: <object classID="CLSID:D719897A-B07A-4C0C-AEA9-9B663A28DFCB" width="1" height="1" id="iTunesDetectorIE" ></object>
Firefox Chrome 等瀏覽器可以通過遍歷其plugin 查看pluginName是否符合來判斷插件存在情況
if(navigator.plugins && navigator.plugins.length > 0) {
for(var b = 0; b < navigator.plugins.length; b++) {
var c = navigator.plugins[b];
var d = c.name;
if(new RegExp(plugname,'i').test(d)) {
a = true
}
}
}
return a
另一種方法是 通過mimetype 做判斷
var mimetype = navigator.mimeTypes["application/"+plugname];
if(mimetype){
a = true;
}else{
a = false;
}
}
catch (e) {
a = false;
}
return a;
四、存在的問題:
IE操作activeX控件的時候 瀏覽器可能會出現(xiàn)小黃條提示 這可能跟你的瀏覽器設(shè)置相關(guān),會有安全提示,這是無法避免的
也不要企圖捕獲小黃條出現(xiàn)的事件,這是安全提示,除非用戶主動操作,其他手段無法干預(yù)
當你的插件在不同的域名下運行時,會重復(fù)提示,只有用戶允許在該域名下運行時,提示才會消失。
當然如果你肯花錢,你可以做成 itunes的插件那樣的,默認在任何域名下運行
五、具體應(yīng)用的實現(xiàn)流程
進入頁面,
瀏覽器判斷
不同瀏覽器的插件支持檢測
cookie記錄檢測結(jié)果
沒有插件————》預(yù)加載彈窗提示資源
監(jiān)測專用協(xié)議連接的點擊情況
根據(jù)插件支持檢測結(jié)果做相應(yīng)操作
有插件————》調(diào)用本地程序處理
無插件(或者檢測不到)————》 彈窗提示安裝軟件
六、關(guān)于強制調(diào)用
如果不能確定本地有沒有相應(yīng)程序支持,而強制將專用鏈接給瀏覽器處理會怎樣?
Firefox Chrome 都有有好的提示界面,提示瀏覽器不知道采用何種程序處理該協(xié)議的鏈接
IE 不同 版本會有不同表現(xiàn),這跟它們的安全級別相關(guān)。
首先所有的IE都會顯示一個丑陋的界面表示瀏覽器打不開這個鏈接
IE6的 安全性能最差,你可以用一個隱藏的iframe 來調(diào)用這個專用鏈接,而不會看到報錯信息,運氣好的話你可以
調(diào)起本地程序
IE7 8 9 則提升了安全性能,如果用隱藏的iframe來調(diào)用不識別的鏈接時,無論嵌套幾層,總會立即反映到最頂層
顯示無法打開該鏈接,意在通知用戶你在調(diào)用一個不識別的協(xié)議,可能會危害你的計算機安全。
IE9 第一次會報錯,顯示無法打開,而再次點擊則不會重復(fù)顯示無法打開的頁面。
七、具體項目應(yīng)用和代碼實現(xiàn)
http://zhushou.360.cn/script/360mobilemgrdownload.js
示例地址:
浙公網(wǎng)安備 33010602011771號