由于项目需求,需要在网页上利用图表展示相关数据的统计信息,采用了OpenFlashChart技术。OpenFlashChart是一款开源的以Flash和Javascript为技术基础的免费图表,用它能创建一些很有效果的报表分析图表。最重要的是它是开源和免费的,支持多种语言。首先在官网上下载开发包,里面包含了所需的flash文件、js文件以及多种语言的demo,这些demo写的非常详细,可以进行参考开发。由于项目使用.net来开发,所以我学习了一下开发包中对应的dotnet代码,这个.net项目采用面向对象的方式对图表进行了合理的分析,创建了一些与OpenFlashChart相对应的类,用来描述图表信息,还编写了相应的用户控件,方便开发人员直接使用。

  好了,废话不多说了,开始说问题了(想了解具体开发技术可参考官网教程和示例代码),由于需要多角度全方位的展示图标,那么就必须要根据不同的要求动态刷新图表信息,根据官网上的方法,可利用以下代码:

 function reload()
{
tmp = findSWF("chart"); //
// reload the data:
//
x = tmp.reload(); //
// to load from a specific URL:
// you may need to 'escape' (URL escape, i.e. percent escape) your URL if it has & in it
//
x = tmp.reload("gallery-data-32.php?beer=1"); //
// do NOT show the 'loading...' message:
//
x = tmp.reload("gallery-data-32.php?beer=1", false);
} function findSWF(movieName) {
if (navigator.appName.indexOf("Microsoft")!= -1) {
return window["ie_" + movieName];
} else {
return document[movieName];
}
}

通过调用reload方法来实现图标刷新,按照这种方式写完代码后运行,在chrome中果然可以达到预想中的效果,然而,IE给我泼了一盆冷水,报出了错误:无法获取属性“reload”的值: 对象为 null 或未定义,甚至官网上点击“reload”时也会报错(如下图),这下我桑心了,估计不好解决了。

没办法,问题总要处理。经过查看,发现错误的主要原因在于findSWF方法返回的对象为null,也就是说在IE中通过 window["ie_" + movieName] 无法得到flash实例,这个方法是作者本人写的,目的就是为了兼容IE,因为官网上的描述是:IE中的图表ID跟firefox不同,因此前面加上了"ie_",不知道为什么不好使。然后我就在网上各种搜索,希望能找到方法,这个问题也确实有很多人遇到,但都没有给出很好的解决方法,无奈之下,我只有进行变通处理,即:在刷新时销毁掉之前的flash对象,重新进行加载,并传入相应的json数据。这种方法也可以实现所需的功能,但是由于我销毁flash对象的手段仅仅是通过删除包含该flash对象的div元素,我总感觉这种方法可能没有真正的将flash对象删除,因为我在网上看到有的人通过此方法删除外层div元素后,里面的flash仍然还在执行相应的操作,一旦情况确实如此,那么每刷新一次就会构造出一个新的flash对象,这样的话如果刷新频繁就会造成内存的消耗不断增长,显然,考虑到这个情况,这种实现方法是行不通的。这下我又陷入了麻烦中,如果这个问题解决不了的话可能就会换用其他技术来实现,那我之前话费时间研究OpenFlashChart就算是做了无用功了,再想想吧,总感觉有解决方法。突然之间,我想到了之前做文件上传时用到了swfupload技术,这也是利用flash对象来实现相关功能的,我打开源码,看看该组件是怎么处理IE的兼容问题的,希望能从中发现一些端倪,经过一番查看,终于在“SWFUpload.prototype.loadFlash”方法中发现了一段话:

// Fix IE Flash/Form bug
if (window[this.movieName] == undefined) {
window[this.movieName] = this.getMovieElement();
}

从注释上看这段代码是为了处理IE bug的,然后继续查看this.getMovieElement()方法:

// Public: get retrieves the DOM reference to the Flash element added by SWFUpload
// The element is cached after the first lookup
SWFUpload.prototype.getMovieElement = function () {
if (this.movieElement == undefined) {
this.movieElement = document.getElementById(this.movieName);
} if (this.movieElement === null) {
throw "Could not find Flash element";
} return this.movieElement;
};

原来获取flash对象就是通过最常用的getElementById方法,这里的movieName就是flash对象的id值,看到这里,我赶紧将findSWF方法中的代码进行了如下修改:

function findSWF(movieName) {
// Fix IE Flash/Form bug
if (window[movieName] == undefined) {
window[movieName] = document.getElementById(movieName);
}
return window[movieName];
}

修改后在chrome浏览器、IE浏览器(正常视图和兼容性视图)和360浏览器(极速模式和兼容模式)上运行,果然都达到了预期的效果,至此,问题解决!

在IE浏览器中执行OpenFlashChart的reload方法时无法刷新的解决方法的更多相关文章

  1. JZTK项目 驾照题库项目servlet层得到的json字符串在浏览器中 汉字部分出现问号?无法正常显示的解决方法

    servlet层中的代码如下: package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.Ser ...

  2. dos中执行cd命令切换不到对应的盘解决方法

    可以使用cd命令,不过需要加参数 /d,如: cd /d e:

  3. Selenium在IE浏览器中执行脚本时输入字符太慢问题解决方法

    问题描述: IE浏览器中执行Selenium脚本的时候发现输入文本的时候总是一个字符一个字符的输入,并且输入每个字符之间都隔几秒.   解决方案: 将使用的IE浏览器驱动由64位的换成32位的.

  4. rpm包安装过程中依赖问题“libc.so.6 is needed by XXX”解决方法

    rpm包安装过程中依赖问题"libc.so.6 is needed by XXX"解决方法 折腾了几天,终于搞定了CentOS上的Canon LBP2900打印机驱动.中间遇到了一 ...

  5. VS2010中GetMenu()和GetSubMenu(0)为NULL引发异常的解决方法 及添加方法

    对于前面问题的分析:来源于http://blog.163.com/yuyang_tech/blog/static/216050083201211144120401/ 解决方法1: //来源:http: ...

  6. 使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法

    使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法 在notebook使用的时候出现了报错 from sklearn.datasets import fetch_mldat ...

  7. 【SQLServer】“无法对数据库’XXX’ 执行删除,因为它正用于复制”的解决方法

    警告: 一个或多个现有列的 ANSI_PADDING 设置为 "off",将以 ANSI_PADDING 为 "on" 的设置重新创建 [SQLServer]& ...

  8. php 字符串中的\n换行符无效、不能换行的解决方法

    php 字符串中的\n换行符无效.不能换行的解决方法 程序的中的换行符\n会直接输出,无法正确换行,解决方法是把单引号改为双引号 aa

  9. 关于swift语言中导入OC三方类找不到头文件的解决方法

    首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...

随机推荐

  1. centos7+mono4+jexus5.6.2安装过程中的遇到的问题

    过程参考: http://www.linuxdot.net/ http://www.jexus.org/ http://www.mono-project.com/docs/getting-starte ...

  2. Android中Activity的四大启动模式实验简述

    作为Android四大组件之一,Activity可以说是最基本也是最常见的组件,它提供了一个显示界面,从而实现与用户的交互,作为初学者,必须熟练掌握.今天我们就来通过实验演示,来帮助大家理解Activ ...

  3. Yeoman 学习笔记

    yoeman 简介:http://www.infoq.com/cn/news/2012/09/yeoman yeoman 官网: http://yeoman.io/ yeoman 是快速创建骨架应用程 ...

  4. C#中实现并发的几种方法的性能测试

    C#中实现并发的几种方法的性能测试 0x00 起因 去年写的一个程序因为需要在局域网发送消息支持一些命令和简单数据的传输,所以写了一个C/S的通信模块.当时的做法很简单,服务端等待链接,有用户接入后开 ...

  5. ASP.NET MVC防范CSRF最佳实践

    XSS与CSRF 哈哈,有点标题党,但我保证这篇文章跟别的不太一样. 我认为,网站安全的基础有三块: 防范中间人攻击 防范XSS 防范CSRF 注意,我讲的是基础,如果更高级点的话可以考虑防范机器人刷 ...

  6. Leetcode 笔记 112 - Path Sum

    题目链接:Path Sum | LeetCode OJ Given a binary tree and a sum, determine if the tree has a root-to-leaf ...

  7. SQL Server数据库损坏、检测以及简单的修复办法

    简介     在一个理想的世界中,不会存在任何数据库的损坏,就像我们不会将一些严重意外情况列入我们生活中的日常一样,而一旦这类事情发生,一定会对我们的生活造成非常显著的影响,在SQL Server中也 ...

  8. ABP框架 - 模块系统

    文档目录 本节内容: 简介 模块定义 生命周期方法 PreInitialize(预初始化) Initialize(初始化) PostInitialize(提交初始化) Shutdown(关闭) 模块依 ...

  9. TODO:从数据库中随机抽取一条记录

    TODO:从数据库中随机抽取一条记录 1.最直接,最粗暴的方法先计算记录的总数,然后选择一个从0到记录总数之间的随机数n,利用skip跳过n条记录,这是效率低下的的方法,首先的记录总数,在用skip会 ...

  10. JS入门

    1,undefined,NaN,Null,infinity 1) undefined 是undefined 类型 var a; //声明变量后不赋值 typeof 类型判断方法 console.log ...