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