在行业软件的环境中,客户方通常拥有很多套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里无法使用。

方案三、编写服务程序

方案四、自定义协议

  • IE->Chrome

    通过在注册表中定义一个Http协议,在协议中用open.command键值调起chrome浏览器打开指定链接。比如自定义一个demo://协议,那么当浏览器发现请求的协议为demo时,就会 采用自定义协议的open键值去处理。关于自定义协议,我写了一个示例源码。这种方式需要在每个客户端执行一次bat脚本。

    由于不同的操作系统下chrome的注册信息路径不一致,所以需要在批处理中考虑不同的操作系统。

  • Chrome->IE

    与IE->Chrome采用相同的操作方式。

END

采用哪种解决方案,需要开发者自己去抉择。