Firefox加载项SDK与YouTube iFrame Player API

时间:2016-09-03 16:44:46

标签: javascript youtube firefox-addon firefox-addon-sdk youtube-iframe-api

我正在使用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&amp;controls=0&amp;enablejsapi=1&amp;origin=resource%3A%2F%2F[ADDON-SCRIPT-ID]&amp;widgetid=1">

......那就好像什么时候打破

更新2:

我发布了YouTube iFrame Player AP,其中涉及iframe的特定问题......

0 个答案:

没有答案