`

__flash__removeCallback未定义错误的解决方案

 
阅读更多

最近两个月来一直有一个BUG纠结在身,就是在系统首页栏目刷新flash图表时总会报“__flash__removeCallback未定义”的错误,而且会重复弹,一直关不掉。



 

在网上呢也找了很多解决方案,很多都说要在页面重写__flash__removeCallback方法,但是我每个地方都重写了还是报错。后来在这个博客找到了解决方案!

下面我先说问题原因:

因为我们一个系统首页有很多栏目,每个栏目都有一个iframe,每个栏目的格式大概为:

<div id="nodeid">
  <div>
  <iframe src="xxx" .../>
  </div>
</div>

 当用户想要刷新指定栏目时,我们的javascript会通过document.getElementById("nodeid").innerHTML="<div>请稍后</div>"这样的方式将<div id="nodeid">栏目中的内容清理掉并重新赋值。每次调用innerHTML的时候就会出现__flash__removeCallback未定义这样的错误,即使加了try...catch都没用,似乎该js错误已经跳出了该代码片段。

后来分析,估计原因是:在执行innerHTML的时候,旧的iframe被销毁,这时flash捕获到被销毁的事件后就会调用__flash__removeCallback方法来处理本身的flash对象(可能是为IE性能考虑),但是因为iframe生命周期已经结束,所以找不到__flash__removeCallback方法,自然就报错了。

 

然后我按照这位大神的思路去处理,即在渲染图表的JSP页面增加onbeforeunload和onunload事件,在页面加载初期和关闭前执行一次图表div的清理操作,果真不报错了。

<head>
<script>
function removeChart(){
    try{
       $("#chart").empty();
    }catch(e){
    }
  }
</script>
</head>
<body class="h100b over_hidden" id="body" onbeforeunload="removeChart()"  onunload="removeChart()">

 然后我调整思路,因为如果每个涉及到flash图表的JSP都修改的话代码非常大,在加载栏目的js中控制最好,那么其实解决思路很简单了:就是在执行document.getElementById("nodeid").innerHTML前找到iframe的body并且清空:

try{
//在iframe销毁前清理掉iframe中的内容(特别是flash)
    $("#"+this.nodeId+" iframe").contents().find("body").empty();
    }catch(e){
    }
document.getElementById(this.nodeId).innerHTML = "<div>请稍候</div>";
......

 然后测试,怎么刷新都没问题了,妥妥的。

注:该问题在我的IE9浏览器重现,其它浏览器不会出现!

 

 

  • 大小: 46.4 KB
0
0
分享到:
评论
1 楼 aawujinghong 2014-01-25  

相关推荐

    ie9下关闭弹出窗口出现__flash__removeCallback未定义错误

    综上所述,要解决IE9下关闭弹出窗口出现__flash__removeCallback未定义错误的问题,需要从Flash对象的生命周期管理入手,确保在对象移除过程中JavaScript环境的正确性。同时,从长远来看,转向使用更现代的Web技术将...

    杰理AC系列OTA库的开发说明_小程序v1.0.01

    \n- **errMsg**:错误信息,当发生错误时提供详细描述。\n- **res**:命令对象,可能包含与事件相关的其他数据。\n\n在实际应用中,开发者需要根据这些回调函数提供的信息来做出相应的响应,例如处理设备连接、断开...

    addcallback:将函数句柄添加到回调列表。 列表中的所有函数都在回调执行时运行-matlab开发

    REMOVECALLBACK(H,回调,FUNC_HANDLE) 删除所有具有指定函数句柄的回调函数(对于指定的回调)。 为了兼容性,还可以使用: 删除回调(H,回调,ID) 列表回调提供所有回调函数的完整列表,按对象和回调排序。

    gmaps3_lineeditor:Google Maps V3 的折线编辑器

    折线(google.maps.Polyline) LineEditor 构造函数:new dw.google.maps.LineEditor(polyline, removeCallback); 这两个参数都是可选的。 polyline 是一个 google.maps.Polyline 实例 removeCallback 是一个在删除...

    Android定时器实现的几种方式整理及removeCallbacks失效问题解决

    为了解决这个问题,可以将Runnable声明为静态成员变量,确保它不会因为Activity的生命周期改变而被重新创建。修改后的代码如下: ```java public class TimerActivity extends Activity { private static final ...

    现代C ++中的异步组播代表

    请注意,这只是一个简化示例,实际应用可能需要更复杂的错误处理和资源管理。 总结起来,现代C++中的异步组播代表是一种高效且灵活的编程技术,它结合了C++17的新特性,如std::function、std::async和std::future,...

    多个surfaceview的切换有问题

    确保在不再使用SurfaceView时调用`SurfaceHolder.removeCallback()`,并添加新的SurfaceView时重新设置回调。 2. **渲染线程**: SurfaceView通常有一个独立的渲染线程来更新画面。如果多个SurfaceView共享同一个...

    老二牛车教育NET程序员面试题之Cache试题

    2. System.Runtime.Caching.MemoryCache:这是.NET Framework 4.0及更高版本中引入的,适用于非Web应用程序,提供了一种跨平台的缓存解决方案。 三、Cache的工作原理 Cache通常遵循LRU(Least Recently Used)策略...

    Android使用SurfaceView实现墨迹天气的风车效果.rar

    在`onPause()`和`onDestroy()`中,调用`holder.removeCallback(this)`并停止`DrawingThread`。 至此,你已经掌握了如何使用SurfaceView来实现类似墨迹天气风车效果的基本步骤。在实际开发中,可能还需要考虑性能...

    Android 简单快速 实现 下雨 Raining

    getHolder().removeCallback(this); } ``` 6. 添加随机性和动态效果: 为了使下雨效果更自然,可以在创建RainDrop对象时赋予它们随机的速度和大小。同时,还可以添加风力效果,让雨滴偏离垂直方向。 通过以上...

    多个SurfaceView无法切换问题

    然后调用`SurfaceHolder`的`removeCallback()`方法,解除回调,避免内存泄漏。 2. 隐藏当前SurfaceView:使用`setVisibility(View.GONE)`将其隐藏,但这并不会销毁Surface,只是在UI上不可见。 3. 创建新的...

    android Camera摄像头开发必备源码

    `SurfaceHolder`提供了控制Surface的生命周期的方法,如`addCallback()`, `removeCallback()`, `setFixedSize()`, `setType()`等。在相机应用中,`SurfaceHolder.Callback`的`surfaceCreated()`方法用于初始化相机...

    给jQuery方法添加回调函数一款插件的应用

    在IIFE内部,使用了jQuery的extend方法来扩展jQuery对象,以增加addCallback和removeCallback这两个新的方法。这样,开发者就可以在任何使用jQuery的地方方便地调用这两个方法来管理回调函数。 具体到用法实例,...

    Android 待机流程

    - **回调移除**:可以通过`removeCallback(Object)`方法来移除之前注册的回调函数。 #### 三、关键方法分析 1. **pokeWakelock()**:该方法通常用于保持CPU处于唤醒状态,防止设备进入休眠状态。 2. **...

    SurfaceView画图

    6. **处理生命周期**:在Activity的`onResume()`和`onPause()`方法中,分别调用`SurfaceHolder.addCallback()`和`SurfaceHolder.removeCallback()`来管理绘图线程的启动和停止。 SurfaceView实例中的关键代码片段...

    Android View类与SurfaceView类详解

    3. `removeCallback(SurfaceHolder.Callback callback)`:移除监听器,可以用于释放资源。 4. `SurfaceHolder.Callback` 接口的三个方法:`surfaceCreated()`, `surfaceChanged()`, `surfaceDestroyed()`,在Surface...

Global site tag (gtag.js) - Google Analytics