2017-09-05 189 views
0

我正在与提供要放入iFrame以显示某些托管视频播放的URL的第三方合作。postMessage()事件侦听器不工作

  • 这是跨域
  • 他们使用JWPlayer作为他们的首选

我要求的方式来“知道”的视频播放完成时的球员。从阅读看来,postMessage()回调看起来像许多人使用的......并且是第三个供应商提出的建议,并提到他们会实施。

我被给了一个测试网址,它有这个'回调'功能...看看我能否使用它。

我似乎无法从回调/侦听器功能得到任何警报?

由于这是我第一次实现这个,我不知道这个错误是源于我的最终还是他们的? 我在想这可能是postMessage()函数的路径吗?

firebugging代码后..我终于资助他们的JS /回调在这里设置:

jwPI.on('complete', function(event){ 
       playbackTime= playbackTime + (jwPI.getPosition() - positionA); 
       positionA=jwPI.getPosition(); 
       parent.postMessage('EndVideo','*'); 
      }); 

我身边的事情有简单的事件监听器添加像这样:

window.addEventListener("message", function(evt) { 
     //do whatever 
     alert("VIDEO CALLBACK FIRED"); 
    }); 

我的问题是:

  1. 为什么这不起作用?目标/范围问题?
  2. 我是否需要让第三方供应商在其postMessage()回调中更新路径? '.parent'实际指向哪里? (如果这是一个嵌入式iFrame?),并有DIV的等等嵌套的iFrame内容?

    我的监听器函数位于加载此iFrame的主父文件中?

  3. 我可以直接将它保留为原样并以某种方式更改侦听器中的路径/目标吗?

回答

0

(发布代表作者问题的答案)

这是一个jQuery和JS解决方案。请注意,jQuery方法需要在作用域中使用originalEvent。

 //jQuery approach 
     $(window).on("message onmessage", function(evt) { 
      //message 
      var targetData = evt.originalEvent.data;    
      //origin 
      var targetOrigin = evt.originalEvent.origin; 
      //check origin for security and to make Scott proud 
      if(targetOrigin !== 'https://example.com'){ 
       //no same origin, exploit attempt in process possibly 
      }   
      //do whatever 
     }); 



     //Javascript approach 
     window.addEventListener("message", function(evt) { 
      //message 
      var targetData = evt.data; 
      //source 
      var targetSource = evt.source; //iframe source message stems from - doesnt work    
      //origin 
      var targetOrigin = evt.origin; 
      if(targetOrigin !== 'https://example.com'){ 
       //no same origin, exploit attempt in process possibly 
      } 
      //do whatever 
     });