最近两个月来一直有一个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浏览器重现,其它浏览器不会出现!
相关推荐
综上所述,要解决IE9下关闭弹出窗口出现__flash__removeCallback未定义错误的问题,需要从Flash对象的生命周期管理入手,确保在对象移除过程中JavaScript环境的正确性。同时,从长远来看,转向使用更现代的Web技术将...
\n- **errMsg**:错误信息,当发生错误时提供详细描述。\n- **res**:命令对象,可能包含与事件相关的其他数据。\n\n在实际应用中,开发者需要根据这些回调函数提供的信息来做出相应的响应,例如处理设备连接、断开...
REMOVECALLBACK(H,回调,FUNC_HANDLE) 删除所有具有指定函数句柄的回调函数(对于指定的回调)。 为了兼容性,还可以使用: 删除回调(H,回调,ID) 列表回调提供所有回调函数的完整列表,按对象和回调排序。
折线(google.maps.Polyline) LineEditor 构造函数:new dw.google.maps.LineEditor(polyline, removeCallback); 这两个参数都是可选的。 polyline 是一个 google.maps.Polyline 实例 removeCallback 是一个在删除...
为了解决这个问题,可以将Runnable声明为静态成员变量,确保它不会因为Activity的生命周期改变而被重新创建。修改后的代码如下: ```java public class TimerActivity extends Activity { private static final ...
请注意,这只是一个简化示例,实际应用可能需要更复杂的错误处理和资源管理。 总结起来,现代C++中的异步组播代表是一种高效且灵活的编程技术,它结合了C++17的新特性,如std::function、std::async和std::future,...
确保在不再使用SurfaceView时调用`SurfaceHolder.removeCallback()`,并添加新的SurfaceView时重新设置回调。 2. **渲染线程**: SurfaceView通常有一个独立的渲染线程来更新画面。如果多个SurfaceView共享同一个...
2. System.Runtime.Caching.MemoryCache:这是.NET Framework 4.0及更高版本中引入的,适用于非Web应用程序,提供了一种跨平台的缓存解决方案。 三、Cache的工作原理 Cache通常遵循LRU(Least Recently Used)策略...
在`onPause()`和`onDestroy()`中,调用`holder.removeCallback(this)`并停止`DrawingThread`。 至此,你已经掌握了如何使用SurfaceView来实现类似墨迹天气风车效果的基本步骤。在实际开发中,可能还需要考虑性能...
getHolder().removeCallback(this); } ``` 6. 添加随机性和动态效果: 为了使下雨效果更自然,可以在创建RainDrop对象时赋予它们随机的速度和大小。同时,还可以添加风力效果,让雨滴偏离垂直方向。 通过以上...
然后调用`SurfaceHolder`的`removeCallback()`方法,解除回调,避免内存泄漏。 2. 隐藏当前SurfaceView:使用`setVisibility(View.GONE)`将其隐藏,但这并不会销毁Surface,只是在UI上不可见。 3. 创建新的...
`SurfaceHolder`提供了控制Surface的生命周期的方法,如`addCallback()`, `removeCallback()`, `setFixedSize()`, `setType()`等。在相机应用中,`SurfaceHolder.Callback`的`surfaceCreated()`方法用于初始化相机...
在IIFE内部,使用了jQuery的extend方法来扩展jQuery对象,以增加addCallback和removeCallback这两个新的方法。这样,开发者就可以在任何使用jQuery的地方方便地调用这两个方法来管理回调函数。 具体到用法实例,...
- **回调移除**:可以通过`removeCallback(Object)`方法来移除之前注册的回调函数。 #### 三、关键方法分析 1. **pokeWakelock()**:该方法通常用于保持CPU处于唤醒状态,防止设备进入休眠状态。 2. **...
6. **处理生命周期**:在Activity的`onResume()`和`onPause()`方法中,分别调用`SurfaceHolder.addCallback()`和`SurfaceHolder.removeCallback()`来管理绘图线程的启动和停止。 SurfaceView实例中的关键代码片段...
3. `removeCallback(SurfaceHolder.Callback callback)`:移除监听器,可以用于释放资源。 4. `SurfaceHolder.Callback` 接口的三个方法:`surfaceCreated()`, `surfaceChanged()`, `surfaceDestroyed()`,在Surface...