前一阵子一直在折腾浏览器的插件检测和自定义协议的支持。

经过种种痛苦的折腾,算是对这一领域有了点浅显的认知。特此记录一下

一、背景知识

自定义协议:常用的协议有 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 = newActiveXObject(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

[转]浅谈浏览器插件检测 和自定义协议的支持相关推荐

  1. 浅谈浏览器插件检测 和自定义协议的支持

    这个东西我也不懂,也不想抄,如想了解,详见:http://www.cnblogs.com/trance/archive/2012/05/16/2503663.html

  2. js浏览器和浏览器插件检测的方法总结

    文/玄魂 前言 首次面对题目所示的需求的时候,头脑中没有任何概念,于是搜索,所有的中文结果都不是很满意.所幸老外的几篇文章还是很有参考价值,虽然最终没有解决我的问题,但是我还是把这几篇文章的内容作了抽 ...

  3. 浅谈浏览器的兼容性(从HTML、CSS、JS、PC端、移动端等方面)

    浅谈浏览器的兼容性) 前言 一.HTML部分 a.html5的新标签 b.img的alt属性 c.ul标签内外边距问题 二.css部分 a.css的hack问题:主要针对IE的不同版本,不同的浏览器的 ...

  4. lua语言学习之自定义wireshark插件来解析自定义协议

    lua语言学习之自定义wireshark插件来解析自定义协议 关于wireshark这个抓包工具 关于lua 使用lua写wireshark插件 wireshark接口文档 如何在wireshark使 ...

  5. 浅谈当前电信检测宽带共享的机制

    本人在深圳,家里用的是中国电信的宽带,之前一直带的是两台电脑,后来把笔记本带回家后就出现了各种无法打开网页的问题.究竟是怎么回事? 时间得推回毕业后的那段时间,某一晚,两台台式机还在正常使用的时候.再 ...

  6. 浅谈浏览器多进程与JS线程

    引言 一直对浏览器的进程.线程的运行一无所知,经过一次的刷刷刷相关的博客之后,对其有了初步的了解,是时候该总结一波了. 进程.线程之间的关系 一个进程有一个或多个线程,线程之间共同完成进程分配下来的任 ...

  7. 浅谈浏览器多进程与JS线程 1

    面试被问到了浏览器线程,没答出来,最终还是感谢拿到了offer 对于浏览器的知识还是知道的太少了,开始恶补TAT 文章目录 一.进程.线程之间的关系 二.浏览器内的进程 三.浏览器内核(渲染进程) 四 ...

  8. 浅谈sketch插件二

    sketch是什么? Sketch是 Mac系统才有的软件,可以理解为精简版的PS ,比PS更适合 UI设计,Sketch 插件开发的语言是类Javascript ,而 Sketchup是一款三维建模 ...

  9. 浅谈浏览器标准模式与怪异模式、文档类型

    在网页设计制作过程中,新人往往会遇到一个问题,就是浏览器的不兼容问题.这种状况在大学学习过程中会经常遇到,但一直也没有得到很好的解决,今天有机会仔细研究了一下,这是有关浏览器标准模式与怪异模式之间的问 ...

最新文章

  1. 使用WinSCP在WIndows与树莓派之间传递文件
  2. 2013年中国数据库大会PPT
  3. 用户密码和cookie,session、token还有AKSK
  4. python函数设置默认参数_Python教程如何设置函数的默认参数
  5. 快速查询ABAP transport request lock status
  6. Scala与Java差异(一)之基础语法
  7. yum方式安装android_linux yum 命令 详解
  8. [HDU]1723Distribute Message
  9. 安装jdk和oracle要注意的知识点
  10. php如何请求api,PHP如何发送GET/POST请求调用API
  11. 功能测试的时代,结束了?
  12. http head详解
  13. wingdings字体符号在哪_出版社编辑对标点符号和专业术语的要求
  14. libubox组件(1)——usock
  15. 食品饮料行业仓库库存管理系统软件,前十排行榜
  16. 如何打开.yml文件
  17. notes java api_Java中通过Notes API访问Domino数据库
  18. 关于沉没成本的座谈会
  19. Prometheus 容器化部署,配合Grafan画图工具监控节点
  20. SwiftUI 色彩教程之 01什么是色差Color difference

热门文章

  1. python 生成html表的报告_pytest文档7-pytest-html生成html报告
  2. 【实验】配置CISCO IOS基于区域的防火墙
  3. vs2008创建mysql数据库_求教VS2008 C++连接MySQL数据库
  4. 阳泉2021高考成绩查询时间段,阳泉高考时间,2021年阳泉高考具体时间科目安排
  5. 判断long类型是否为空_数据类型
  6. 【知识星球】ElementAI提出超复杂多尺度细粒度图像分类Attention模型
  7. 【Tensorflow】io 操作
  8. 全球及中国停车场建设产业十四五盈利模式与建设现状分析报告2022版
  9. iOS快速开发框架--Bee Framework
  10. 微量元素与中医药 谋定·大健康医药-李喜贵:辩证研究病理变化