跨浏览器调用总结
在行业软件的环境中,客户方通常拥有很多套B/S软件系统,可能各自对浏览器有着特殊的要求,比如必须用chrome
访问,必须用IE
访问等。当去做一个集成类的B/S系统时,就出现了需要唤起特定的浏览器去打开特定的url的场景,笔者根据自己的经验对可以采取的方案进行了总结。
方案一、使用插件及引擎
IE->Chrome
通过安装google-chrome-frame框架,然后使用gcf://协议去指定IE调用google-chrome-frame去渲染。但需要注意的是,谷歌浏览器内嵌框架从2014年2月25日起已经停止维护更新。
Chrome->IE
通过安装Chrome扩展组件,如IETab,Open IE等,然后在js中调用。由于行软环境通常无法访问外网,而且谷歌应用商店在墙外,所以开发者需要直接提供.extension文件供客户安装。有一定的实施难度。
方案二、通过ActiveX控件
IE->Chrome
通过js的ActiveXObject对象来调用Chrome。需要注意的是这种方法需要修改浏览器的安全级别允许加载Active控件。需要预先知道Chrome的路径。
function Run(strPath)
{
try
{
var objShell = new ActiveXObject("wscript.shell");
objShell.Run(strPath);
objShell = null;
} catch(e){
alert(e);
}
}Chrome->IE
由于ActiveX是微软的一套东西,微软以外的浏览器是不支持的。所以如果需要Chrome运行ActiveX,需要在Chrome上安装扩展组件
ActiveX for Chrome
。下载。要注意的是这个组件是基于NPAPI的,所以可能在较新的Chrome里无法使用。
方案三、编写服务程序
通用
编写一个本地的socket服务程序,每个客户端需要安装一个应用程序,这个应用程序安装后每次系统启动后自启动,相当于本地常驻一个服务。点击要打开的外部系统连接后通过js向这个本地服务发送特定的消息格式,比如openOutSystem:www.baidu.com,本地服务程序接收到消息后解析出要打开的地址www.baidu.com,调用本地IE浏览器程序并传递该地址参数即可。这种方式,**需要开发一个程序,对每个客户端需要做一次服务程序的实施,另外服务程序最好开机启动并保持运行**。
方案四、自定义协议
IE->Chrome
通过在注册表中定义一个Http协议,在协议中用open.command键值调起chrome浏览器打开指定链接。比如自定义一个demo://协议,那么当浏览器发现请求的协议为demo时,就会 采用自定义协议的open键值去处理。关于自定义协议,我写了一个示例源码。这种方式需要在每个客户端执行一次bat脚本。
由于不同的操作系统下chrome的注册信息路径不一致,所以需要在批处理中考虑不同的操作系统。
Chrome->IE
与IE->Chrome采用相同的操作方式。
END
采用哪种解决方案,需要开发者自己去抉择。