我正在使用Add-on SDK处理firefox插件,在该插件中我使用port.on()和port.emit()按照所述内容脚本与主插件脚本进行通信{{3} }。
我的插件也使用here in the Add-on SDK documentation我。如果不是这个问题,API工作得很好:似乎一旦我创建了YT.Player()的新实例(使用YouTube API),port.on()/ port.emit()通信我的主要插件脚本和我的内容脚本之间的加载项停止工作......
如果我尝试在我的内容脚本中执行此操作
addon.port.emit('anything');
在创建YT.Player()的实例之前,我的主要插件脚本可以很好地接收它:
....
worker.port.on('anything',function(){
// works just fine...
});
....
但是如果我在实例化YT.Player()后尝试做同样的事情,那么主插件脚本将不会触发任何触发的port.emit事件。就好像引入一个YT.Player()实例以某种方式破坏了通信。
当我使用调试器时,我可以确认'addon.port'仍然存在(它只是不起作用)。使用调试器我在创建YT.Player的实例时也逐步完成了缩小的API代码,当它到达API库中的这些混淆代码时,通信停止工作大约有94个左右的“步骤”(第82行
;function N(a,b,c){this.b=b;this.h=this.a=null;this.g=this[t]||(this[t]=++ca);this.c=0;this.B=!1;this.w=[];this.f=null;this.s=c;this.v={};b=document;if(a=r(a)?b.getElementById(a):a)if("iframe"!=a.tagName.toLowerCase()&&(b=yb(this,a),this.h=a,(c=a.parentNode)&&c.replaceChild(b,a),a=b),this.a=a,this.a.id||(b=a=this.a,b=b[t]||(b[t]=++ca),a.id="widget"+b),L[this.a.id]=this,window.postMessage){this.f=new H;zb(this);a=O(this.b,"events");for(var d in a)a.hasOwnProperty(d)&&this.addEventListener(d,a[d]);for(var e in ub)Ab(this,
// ......清理后的样子......
function N(a, b, c) {
this.b = b;
this.h = this.a = null;
this.g = this[t] || (this[t] = ++ca);
this.c = 0;
this.B = !1;
this.w = [];
this.f = null;
this.s = c;
this.v = {};
b = document;
if (a = r(a) ? b.getElementById(a) : a)
if ("iframe" != a.tagName.toLowerCase() &&
(b = yb(this, a), this.h = a, (c = a.parentNode) && c.replaceChild(b, a), a = b),
this.a = a,
this.a.id ||
(b = a = this.a, b = b[t] ||
(b[t] = ++ca), a.id = "widget" + b),
L[this.a.id] = this, window.postMessage) {
this.f = new H;
zb(this);
a = O(this.b, "events");
for (var d in a) a.hasOwnProperty(d) && this.addEventListener(d, a[d]);
for (var e in ub) Ab(this,e)
}
}
任何想法可能会发生什么?或者关于如何进一步调试这种情况的任何建议......我完全失败了:(
更新:
在进一步调试后,我缩小了addon port.emit / port.on通信停止工作的确切时间点,确实是在YouTube API库中的上一行运行时(在YT.Player()实例化期间)过程)。特别是当它运行时,它在第二个if语句中:
c.replaceChild(b, a)
我已经将c标识为document.body,a(被替换的元素)是我最初传递给YT.Player()构造函数的元素,因为我想要放置YouTube播放器的实例in和b(替换a的元素)是一个iframe(在这个过程中创建),所以回顾一下,当实例化过程替换我最初传入它的元素作为玩家所需的父容器时,看起来像这样:
<div id="player"></div>
使用新的iframe,如下所示:
<iframe width="600" height="345" frameborder="0" id="player" allowfullscreen="1" title="YouTube video player" src="http://www.youtube.com/embed/[YT-VIDEO-ID]?autoplay=1&controls=0&enablejsapi=1&origin=resource%3A%2F%2F[ADDON-SCRIPT-ID]&widgetid=1">
......那就好像什么时候打破
更新2:
我发布了YouTube iFrame Player AP,其中涉及iframe的特定问题......