跨浏览器调用总结

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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

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