在IE浏览器中执行OpenFlashChart的reload方法时无法刷新的解决方法
由于项目需求,需要在网页上利用图表展示相关数据的统计信息,采用了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方法时无法刷新的解决方法的更多相关文章
- JZTK项目 驾照题库项目servlet层得到的json字符串在浏览器中 汉字部分出现问号?无法正常显示的解决方法
servlet层中的代码如下: package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.Ser ...
- dos中执行cd命令切换不到对应的盘解决方法
可以使用cd命令,不过需要加参数 /d,如: cd /d e:
- Selenium在IE浏览器中执行脚本时输入字符太慢问题解决方法
问题描述: IE浏览器中执行Selenium脚本的时候发现输入文本的时候总是一个字符一个字符的输入,并且输入每个字符之间都隔几秒. 解决方案: 将使用的IE浏览器驱动由64位的换成32位的.
- rpm包安装过程中依赖问题“libc.so.6 is needed by XXX”解决方法
rpm包安装过程中依赖问题"libc.so.6 is needed by XXX"解决方法 折腾了几天,终于搞定了CentOS上的Canon LBP2900打印机驱动.中间遇到了一 ...
- VS2010中GetMenu()和GetSubMenu(0)为NULL引发异常的解决方法 及添加方法
对于前面问题的分析:来源于http://blog.163.com/yuyang_tech/blog/static/216050083201211144120401/ 解决方法1: //来源:http: ...
- 使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法
使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法 在notebook使用的时候出现了报错 from sklearn.datasets import fetch_mldat ...
- 【SQLServer】“无法对数据库’XXX’ 执行删除,因为它正用于复制”的解决方法
警告: 一个或多个现有列的 ANSI_PADDING 设置为 "off",将以 ANSI_PADDING 为 "on" 的设置重新创建 [SQLServer]& ...
- php 字符串中的\n换行符无效、不能换行的解决方法
php 字符串中的\n换行符无效.不能换行的解决方法 程序的中的换行符\n会直接输出,无法正确换行,解决方法是把单引号改为双引号 aa
- 关于swift语言中导入OC三方类找不到头文件的解决方法
首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...
随机推荐
- 关于Vue.js 2.0 的 Vuex 2.0,你需要更新的知识库
应用结构 实际上,Vuex 在怎么组织你的代码结构上面没有任何限制,相反,它强制规定了一系列高级的原则: 应用级的状态集中放在 store 中. 改变状态的唯一方式是提交mutations,这是个同步 ...
- Ngrok让你的本地Web应用暴露在公网上
1.Ngrok介绍 Ngrok是一个反向代理,通过在公共的端点和本地运行的Web服务器之间建立一个安全的通道.Ngrok可捕获和分析所有通道上的流量,便于后期分析和重放.简单来说,利用 Ngrok可以 ...
- C#多线程之线程同步篇1
在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...
- JavaScript自定义媒体播放器
使用<audio>和<video>元素的play()和pause()方法,可以手工控制媒体文件的播放.组合使用属性.事件和这两个方法,很容易创建一个自定义的媒体播放器,如下面的 ...
- 【C#附源码】数据库文档生成工具支持(Excel+Html)
[2015] 很多时候,我们在生成数据库文档时,使用某些工具,可效果总不理想,不是内容不详细,就是表现效果一般般.很多还是word.html的.看着真是别扭.本人习惯用Excel,所以闲暇时,就简单的 ...
- 步入angularjs directive(指令)--点击按钮加入loading状态
今天我终于鼓起勇气写自己的博客了,激动与害怕并存,希望大家能多多批评指导,如果能够帮助大家,也希望大家点个赞!! 用angularjs 工作也有段时间了,总体感觉最有挑战性的还是指令,因为没有指令的a ...
- 来自于微信小程序的一封简讯
9月21晚间,微信向部分公众号发出公众平台-微信应用号(小程序)的内测邀请,向来较为低调的微信在这一晚没人再忽视它了. 来自个人博客:Damonare的个人博客 一夜之间火了的微信应用号你真的知道吗? ...
- 【Java每日一题】20170104
20170103问题解析请点击今日问题下方的"[Java每日一题]20170104"查看(问题解析在公众号首发,公众号ID:weknow619) package Jan2017; ...
- 【架构设计】分布式文件系统 FastDFS的原理和安装使用
本文地址 分享提纲: 1.概述 2. 原理 3. 安装 4. 使用 5. 参考文档 1. 概述 1.1)[常见文件系统] Google了一下,流行的开源分布式文件系统有很多,介绍如下: -- mo ...
- github免输用户名/密码SSH登录的配置
从github上获取的,自己整理了下,以备后用. Generating an SSH key mac windows SSH keys are a way to identify trusted co ...