2014-07-09 159 views
0

我们使用JsApin进行插件和页面js之间的双向通信。 有时这个对象停止工作。JsApi有时会被破坏

下面是我们正在做的事情:

<object type="..."> 
    ... 
    <param name="onload" value="pluginloaded" /> 
    ... 
</object> 

var myObj = { 
    element: ..., // reference to the dom element for the object tag 
    ... 
} 

function pluginloaded(jsapi) { 
    myObj.jsapi = jsapi; 
} 

正如你可以看到,我们保持一个参照这两个DOM对象元素和被传递到的onload方法JSAPI对象。
当试图在插件(或属性)上执行一个方法时,它将首先尝试myObj.jsapi.method(),如果失败,则返回'myObj.element.method()`,如果失败则会报告。统计数据显示它并不经常发生,但确实发生,尽管我不知道如何重现它,只是有时会发生。

任何想法可能导致此对象不可用的原因?从js的角度来看,jsapi对象是未定义的,并且object元素没有从插件公开的方法/属性。

谢谢。

+0

如果您使用从pluginloaded函数调用中保存的jsapi或访问html元素本身的方法,是否有关系? – taxilian

+0

不,这并不重要,问题是没有一个工作(发生此问题时),jsapi对象未定义,并且在元素本身上添加的方法/属性未定义。任何想法为什么? –

回答

1

没有花更多时间看你的实际项目,很难说肯定,但这听起来像你实际上卸载和/或重新加载你的插件。导致这种情况的最常见的事情是当您在DOM中移动它时 - 例如,如果使用javascript创建对象标记,并且在将它放入DOM之前将其设置为.type:

var obj = Document.create("object"); 
obj.type = "application/x-mytype"; 

someElement.appendChild(obj); 

这似乎是一个好主意,但是当你这样做时,浏览器实际上会部分地破坏插件对象。同样,如果您在插件对象或其父项上设置了css display: noneoverflow: {anything here},可能会导致此问题。

无论如何,不​​管发生了什么,我敢打赌,你正在卸载插件,从而使您抓取的jsapi对象失效。

+0

好吧,这很有趣,很好的了解。我会研究这个,看看我们正在做什么,看起来像你所描述的,但有没有办法在运行时捕捉这个问题,并以某种方式修复它? js部分注意到它,但不能通知插件。有没有一种方法让插件知道?如果是的话,我可以调用一个js方法,并用新的jsapi实例“重置”它吗?谢谢。 –

+0

不是我找到的。 – taxilian

+1

从我上一天的实验中,我设法重现问题的唯一方法是在显示值之间进行切换。问题是,一旦我将它改回阻塞,那么插件会调用发送新jsapi的onload方法,这在我们的情况下应该解决问题。无论如何,我认为我设法通过有一个解决方案在js和插件之间有两个方向性的“脉冲”,如果在X时间后插件没有从js得到一个调用,它假定api被破坏并发送一个新的。我分享了回购:https://github.com/rounds/FireBreathBrokenJsApi –