IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

BO报表系统嵌入Iframe在firefox下的错误修改

淘宝数据平台团队 2010-06-01 21:56:50 累计浏览 5,700 次
本机暂存

    1. 需求概要

    BO报表嵌入Iframe框架中,在IE下功能正常,firefox下功能错误。

    主要原因,由于BO报表内嵌的frame元素较多,ie和firefox对读取iframe元素的js操作存在差异导致

    解决方法,修改js的相关方法,以达到不同浏览器的兼容

    2. 技术方案

     2.1 具体说明

     2.1.1 utils.js

     2.1.1.1 文件路径

     以businessobjects为项目目录

     businessobjects\\enterprise115\\desktoplaunch\\InfoView\\utils\\utils.js

     2.1.1.2 修改内容

     原方法内容:

     function findElementById(Id) {

     var mywin = window;

     while (mywin != mywin.parent && mywin.parent &&mywin.parent.document) {

     mywin = mywin.parent;

     }

     var f = mywin.document.getElementById(Id);

     if (f != null) return f;

     for (var i = 0; i < mywin.length; i++) {

     f = findElementHelper(mywin.frames[i], Id);

     if (f != null) return f;

     }

     return null;

     }

     修改后的方法内容:

     function findElementById(Id) {

     var mywin = window;

     var curwin = window;

     curwin = mywin;

     try {

     while (mywin != mywin.parent

     && mywin.parent &&mywin.parent.document) {

     mywin = mywin.parent;

     curwin = mywin;

     }

     } catch (err) {

     mywin = curwin;

     }

     var f = mywin.document.getElementById(Id);

     if (f != null) return f;

     for (var i = 0; i < mywin.length; i++) {

     f = findElementHelper(mywin.frames[i], Id);

     if (f != null) return f;

     }

     return null;

     }

     2.1.1.3 修改说明

     由于没有嵌套iframe时,ie和firefox的逻辑都是正常的

     嵌套后firefox中mywin != mywin.parent && mywin.parent&&

     mywin.parent.document此语句运行时会出现异常,主要是上级对象的获取错误。

     因此在JS中,在保持原逻辑的情况下,对出现的异常进行捕捉操作。

     如果对象mywin.parent不存在时,直接获取mywin即可。

     2.1.2 IVIntegration.js

     2.1.2.1 文件路径

     以businessobjects为项目目录

     businessobjects\\enterprise115\\desktoplaunch\\viewers

     \\cdz_adv\\scripts\\IVIntegration.js

     2.1.2.2 修改内容

     原方法内容:

     function setDocTitle(strDocName){

     var myframe=self;

     while (myframe.parent && myframe!=myframe.parent){

     myframe=myframe.parent;

     var isAppsFrame=(myframe.thisIsAnAppsFrame

     &&myframe.thisIsAnAppsFrame==”wishYouAreHere”)?true:false;

     if (isAppsFrame) break;

     var isTop=(myframe.thisIsTheIVTopFrame

     &&myframe.thisIsTheIVTopFrame==”wishYouAreHere”)?true:false;

     var fs=myframe.frames;

     if (fs){

     var header=fs[0];

     if (header && header.setTitle){

     header.setTitle(convStr(strDocName));

     break;

     }

     }

     if (isTop) break;

     }

     }

     修改后的方法内容:

     function setDocTitle(strDocName){

     var myframe=self;

     while (myframe.parent && myframe!=myframe.parent){

     myframe=myframe.parent;

     try {

     var isAppsFrame=(myframe.thisIsAnAppsFrame

     &&myframe.thisIsAnAppsFrame==”wishYouAreHere”)?true:false;

     }catch(e){

     var isAppsFrame = true;

     }

     if (isAppsFrame) break;

     var isTop=(myframe.thisIsTheIVTopFrame

     &&myframe.thisIsTheIVTopFrame==”wishYouAreHere”)?true:false;

     var fs=myframe.frames;

     if (fs){

     var header=fs[0];

     if (header && header.setTitle){

     header.setTitle(convStr(strDocName));

     break;

     }

     }

     if (isTop) break;

     }

     }

     2.1.2.3 修改说明

     由于BO报表本身就是iframe结构,因此再嵌入iframe页面中,获取指定对象的操作就会变得复杂。

     加之ie和firefox浏览器,在js中对iframe对象的获取方法需要有的兼容性,因此此方法的某些语句在firefox下便会发生错误。

     发生错误的语句为,var isAppsFrame=(myframe.thisIsAnAppsFrame

     &&myframe.thisIsAnAppsFrame==”wishYouAreHere”)?true:false。

     还是保持不改变源程序逻辑基础上进行改进,将出现的异常进行捕捉。

     如果获取这些frame对象出现异常时,定义var isAppsFrame=true即可。

同分类推荐文章

  1. translateZ() (2026-06-25 21:18:56)
  2. translateY() (2026-06-25 21:17:56)
  3. translateX() (2026-06-25 21:16:01)

查看更多 前端 文章 →

建议继续学习

  1. JQuery实现Excel表格呈现 (累计阅读 48,349)
  2. 深入理解Javascript之执行上下文(Execution Context) (累计阅读 18,404)
  3. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,933)
  4. 图片动态局部毛玻璃模糊效果的实现 (累计阅读 14,848)
  5. 天朝第二代身份证号码的验证机制 (累计阅读 14,761)
  6. HTML 5 的data-* 自定义属性 (累计阅读 14,349)
  7. 分享一个JQUERY颜色选择插件 (累计阅读 14,223)
  8. 什么是全栈工程师? (累计阅读 14,038)
  9. 快速排序(Quicksort)的Javascript实现 (累计阅读 11,735)
  10. 7 天打造前端性能监控系统 (累计阅读 11,187)