[转]浅谈浏览器插件检测 和自定义协议的支持
前一陣子一直在折騰瀏覽器的插件檢測和自定義協議的支持。
經過種種痛苦的折騰,算是對這一領域有了點淺顯的認知。特此記錄一下
?
一、背景知識
自定義協議:常用的協議有 http:// https:// ?ftp:// 等
然而我們也經常會遇到類似這樣的協議連接 ?
thunder:// ?迅雷的
item:// ?itunes的
ed2k:// 電驢的
這樣的協議是需要本地計算機安裝軟件與之接應, 實現相應操作的
也就是當你點一個類似的連接,瀏覽器會通知系統以何種程序處理該種協議的連接,這種對應是通過注冊表來實現的
參考資料:http://www.cnblogs.com/Aricc/archive/2009/03/18/1415929.html?
?
二、實現方案
要定義一個自定義協議,首先需要你有一款程序與之對應,
也就是說這個協議得有軟件去處理,一般會是下載操作。
而自定義協議連接最終是顯示在網頁上的,最終這是網頁與本地程序之間的交互。
而之間的橋梁就是瀏覽器。
那么要支持一個自定義協議,還需要去檢測本地是否有支持該協議的處理程序。
這個能力的檢測是要通過檢測瀏覽器的插件來判斷的。
也就是 裝軟件的時候同時給瀏覽器增加插件,以便標示系統有能力支持協議。
畫一個流程圖:
發布軟件 和自定義協議——》安裝軟件同時給瀏覽器安裝插件———》用腳本檢測瀏覽器插件以判斷支持情況————》點擊自定義協議連接調用本地程序處理
?
三、插件檢測
IE 可以通過嘗試?new ActiveXObject(axname); 操作是否成功來判斷插件存在情況
var a = false;try {var obj = new ActiveXObject(axname);a = true;} catch (e) {a = false; };return a;IE的另一種方法是 ?預先埋設一個 object 并查看該object的屬性或者方法來判斷本地是否有能力支持
比如apple itunes的object為:?<object classID="CLSID:D719897A-B07A-4C0C-AEA9-9B663A28DFCB" width="1" height="1" id="iTunesDetectorIE" ></object>
Firefox Chrome 等瀏覽器可以通過遍歷其plugin 查看pluginName是否符合來判斷插件存在情況
var a = false;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 做判斷
try {var mimetype = navigator.mimeTypes["application/"+plugname];if(mimetype){a = true;}else{a = false;}}catch (e) {a = false;}return a;?
四、存在的問題
IE操作activeX控件的時候 瀏覽器可能會出現小黃條提示 這可能跟你的瀏覽器設置相關,會有安全提示,這是無法避免的
也不要企圖捕獲小黃條出現的事件,這是安全提示,除非用戶主動操作,其他手段無法干預
當你的插件在不同的域名下運行時,會重復提示,只有用戶允許在該域名下運行時,提示才會消失。
當然如果你肯花錢,你可以做成 itunes的插件那樣的,默認在任何域名下運行
?要獲取這個權限需要跟微軟談,這是BD的事兒,不是RD的事兒。
當PM們說為何同樣的代碼蘋果能做到,而你為何做不到的時候,可以明確告訴他們, 這不是技術的事兒。
?
?五、具體應用的實現流程
進入頁面,
瀏覽器判斷
不同瀏覽器的插件支持檢測
cookie記錄檢測結果
沒有插件————》預加載彈窗提示資源?
監測專用協議連接的點擊情況
根據插件支持檢測結果做相應操作
有插件————》調用本地程序處理
無插件(或者檢測不到)————》 彈窗提示安裝軟件
?
六、關于強制調用
如果不能確定本地有沒有相應程序支持,而強制將專用鏈接給瀏覽器處理會怎樣?
Firefox Chrome 都有有好的提示界面,提示瀏覽器不知道采用何種程序處理該協議的鏈接
IE 不同 版本會有不同表現,這跟它們的安全級別相關。
首先所有的IE都會顯示一個丑陋的界面表示瀏覽器打不開這個鏈接?
IE6的 安全性能最差,你可以用一個隱藏的iframe 來調用這個專用鏈接,而不會看到報錯信息,運氣好的話你可以
調起本地程序
IE7 8 9 則提升了安全性能,如果用隱藏的iframe來調用不識別的鏈接時,無論嵌套幾層,總會立即反映到最頂層
顯示無法打開該鏈接,意在通知用戶你在調用一個不識別的協議,可能會危害你的計算機安全。
IE9 第一次會報錯,顯示無法打開,而再次點擊則不會重復顯示無法打開的頁面。
?
七、具體項目應用和代碼實現
http://zhushou.360.cn/script/360mobilemgrdownload.js
?示例地址:
?http://zhushou.360.cn/
?
注:原文為http://www.cnblogs.com/trance/archive/2012/05/16/2503663.html
轉載于:https://www.cnblogs.com/artwl/archive/2013/05/17/3083430.html
總結
以上是生活随笔為你收集整理的[转]浅谈浏览器插件检测 和自定义协议的支持的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uva11111 Generalize
- 下一篇: CALayer 一些简单的小例子