__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" οnbefοreunlοad="removeChart()"  οnunlοad="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浏览器重现,其它浏览器不会出现!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
canfestival是一个开源的CANopen协议栈实现,可以在嵌入式系统中使用。canfestival.h文件包含了CANopen协议栈的API,下面是部分代码示例: ```c // CANopen数据类型定义 typedef unsigned char UNS8; typedef signed char S8; typedef unsigned short UNS16; typedef signed short S16; typedef unsigned int UNS32; typedef signed int S32; // CANopen数据类型定义-浮点型 typedef float REAL32; typedef double REAL64; // CANopen数据类型定义-时间类型 typedef UNS32 TIMER_HANDLE; typedef UNS32 TIMEVAL; // CANopen节点消息类型定义 typedef struct { UNS16 cob_id; UNS8 rtr; UNS8 len; UNS8 data[8]; } Message; // CANopen节点对象字典条目定义 typedef struct { UNS32 index; UNS8 subindex; UNS8 size; UNS8 *pObject; void (*callback)(UNS16 index, UNS8 subindex); } CO_Data; // CANopen节点API函数定义 UNS8 canReceive(CO_Data* d, UNS16 *cobID, Message *m); UNS8 canSend(CO_Data* d, UNS16 cobID, UNS8 *msg, UNS8 len); UNS8 writeLocalDict(CO_Data* d, UNS16 wIndex, UNS8 bSubindex, void *pSourceData, UNS8 ObjSize); UNS8 readLocalDict(CO_Data* d, UNS16 wIndex, UNS8 bSubindex, void *pDestData, UNS8 ObjSize); void setState(CO_Data* d, e_nodeState newState); void setStateStopped(CO_Data* d); void setStateOperational(CO_Data* d); void setStatePreOperational(CO_Data* d); e_nodeState getState(CO_Data* d); void canClose(CO_Data* d); UNS8 canInit(CO_Data* d); UNS8 setNodeId(CO_Data* d, UNS8 nodeId); UNS8 getNodeId(CO_Data* d); void setHeartbeatError(CO_Data* d, UNS8 heartbeatID, UNS8 error); UNS8 setSearch(CO_Data* d, UNS8 nodeId); UNS8 getSDOTimeout(CO_Data* d); void setSDOTimeout(CO_Data* d, UNS8 value); UNS8 getNodeId(CO_Data* d); UNS8 getLastNode(CO_Data* d); UNS8 getMasterNodeId(CO_Data* d); UNS8 setMasterNodeId(CO_Data* d, UNS8 nodeId); UNS8 getObject(CO_Data* d, UNS16 index, UNS8 subIndex, void *pDestData, UNS8 *pNbBytes); UNS8 setObject(CO_Data* d, UNS16 index, UNS8 subIndex, void *pSourceData, UNS8 NbBytes); void EnableApplicationTimer(void); void DisableApplicationTimer(void); UNS32 getElapsedTime(void); void EnterMutex(void); void LeaveMutex(void); UNS8 RegisterSetODentryCallBack(CO_Data* d, UNS16 wIndex, UNS8 bSubindex, void (*Callback)(UNS16 wIndex, UNS8 bSubindex)); void RemoveSetODentryCallBack(CO_Data* d, UNS16 wIndex, UNS8 bSubindex); UNS8 RegisterGetODentryCallBack(CO_Data* d, UNS16 wIndex, UNS8 bSubindex, void (*Callback)(UNS16 wIndex, UNS8 bSubindex)); void RemoveGetODentryCallBack(CO_Data* d, UNS16 wIndex, UNS8 bSubindex); UNS8 RegisterCallback(CO_Data* d, UNS8 func, void (*callback)(CO_Data* d, UNS8), UNS8 object); void RemoveCallback(CO_Data* d, UNS8 func, UNS8 object); void canChangeBaudRate(CO_Data* d, UNS32 baud); void canChangeFilter(CO_Data* d, UNS16 w0, UNS16 w1, UNS16 w2, UNS16 w3); UNS8 CANopen_SendNMTstateChange(CO_Data* d, UNS8 cs); void InitTimer(TIMER_HANDLE *Handle); void StartTimerLoop(TIMER_HANDLE *Handle, void (*CallBackFunction)(TIMER_HANDLE *)); void StopTimerLoop(TIMER_HANDLE *Handle); UNS8 getTimerLoopStatus(TIMER_HANDLE *Handle); UNS8 getTime(TIMEVAL *tv); int timeval_subtract(TIMEVAL *result, TIMEVAL *x, TIMEVAL *y); ``` 以上是canfestival.h文件中部分常见的API函数和数据类型定义,使用canfestival时,可以根据需要调用这些API函数,并使用这些数据类型来实现CANopen节点的控制和通信。需要注意的是,在使用canfestival时,需要按照CANopen协议的规范进行配置和使用,具体的配置方法和使用方法可以参考canfestival官方文档中的说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值