通过meta段的设置可以控制浏览器的渲染行为,但在一些特殊情况下,meta段的设置无效,我们需要额外的操作以达到目的。
模式1:页面A(IE)iFrame引用页面B(Chrome Frame)
问题描述
在IE渲染的页面A中,使用iframe引用的页面B即使添加了meta信息也不会使用Chrome Frame渲染。
解决方法
CFInstance.js(见文档附件)同样是由Google提供的开源源代码,帮助我们更灵活的使用Chrome Frame。在页面A中引入CFInstance.js,页面加载完毕后调用new CFInstance()。其返回一个内部使用Chrome Frame渲染的Object对象。最后将该对象添加至A页面目标位置(删除原iframe,不再需要)。示例代码如下:
function onload() { if (CFInstance && CFInstance.isAvailable()) { //判断CFInstance是否可用 var gcf = new CFInstance({ src : url, //页面B的url地址 className : “chrome-frame” //通过该className可以控制返回对象的css }); document.body.appendChild(gcf); //添加至页面指定位置 } else { open(url, “_self”); //CFInstance不可用时执行的动作 } };
问题描述模式2:页面A(Chrome Frame)iFrame引用页面B(IE)
在Chrome Frame渲染的页面A中,使用iframe引用的页面B(无论是否添加了meta段)也将使用Chrome Frame渲染。
解决方法
调整页面结构,增加框架页C(使用IE渲染)。将页面A、B分别使用new CFInstance和iframe方式引入并布局在框架页C中,页面结构如下:
模式3:页面A(Chrome Frame)Open页面B(IE)
问题描述
在Chrome Frame渲染的页面A中,调用window.open打开的页面B(无论是否添加了meta段)也将使用Chrome Frame渲染。
解决方法
调整页面结构,增加框架页C(使用IE渲染)。通过new CFInstance方式将页面A引入框架页C,在页面A中调用框架页C的open方法打开页面B。这时页面B将使用IE渲染。页面结构如下:
在页面A中调用框架页C的open方法时,不能简单的通过window.parent.open方式实现,需要借助CFInstance的rpc实现跨浏览器通讯。示例代码如下:
//框架页C代码示例 function onload() { if (CFInstance && CFInstance.isAvailable()) { var gcf = new CFInstance({ src : url, className : “chrome-frame” }); gcf.rpc.expose(“showIEDialog”, showIEDialog); //注册页面A中可调用的方法 document.body.appendChild(gcf); } else { open(url, “_self”); } };function showIEDialog(url, name, options) { window.open(url, name, options); } //页面A代码示例 if (CFInstance && !dorado.Browser.msie) { //判断当前为非IE浏览器且CFInstance可用 if (CFInstance.rpc) { //判断当前页面是否通过new CFInstance方式打开 //调用框架页C中暴露的方法showIEDialog,第二个参数为传递的参数 CFInstance.rpc.callRemote(“showIEDialog”, [ url, name, options ]); CFInstance.rpc.init(); } else { //当前页面非new CFInstance方式打开,例如直接使用Chrome浏览器打开了框架页C alert(“目标地址需要IE浏览器”); } } else { //当前浏览器为IE且Chrome Frame不可用,页面A为IE渲染 open(url, name, options); }
模式4:页面A(Chrome Frame)使用 ActiveX
问题描述
如何在Chrome Frame渲染的页面中使用ActiveX。
解决方法
不推荐在Chrome Frame渲染的页面中使用ActiveX,需要确保使用ActiveX控件的页面由IE渲染。
存疑的备选解决方法
ActiveX for Chrome是一款专门为Chrome浏览器开发的扩展程序,其目的是为了在Chrome浏览器中可以直接使用ActiveX控件。但该项目已经很长一段时间没有更新。在本次项目中,经过实际测试,其并不能很好的为所有ActiveX控件提供支持。因此,如果使用ActiveX for Chrome,一定要进行全功能覆盖测试。
项目地址:http://code.google.com/p/np-activex/
参考资料:http://wiki.bsdn.org/pages/viewpage.action?pageId=50070010