event-listener - postMessage() 事件监听器不工作

标签 event-listener postmessage

我正在与第 3 方合作,后者提供要放入 iFrame 中以显示一些托管视频播放的 URL。

  • 这是跨域的
  • 他们使用 JWPlayer 作为他们选择的播放器

我请求一种方法来“知道”视频播放何时完成。从阅读来看,postMessage() 回调似乎是很多人使用的......并且是第三个供应商建议的,并提到他们将实现。

我得到了一个测试 url,里面有这个“回调”功能……看看我是否可以使用它。

我似乎无法从回调/监听器函数中获得任何警报?

因为这是我第一次实现这个,我不确定这个错误是我的还是他们的? 我在想这可能是 postMessage() 函数的路径?

在调试代码之后..我最终资助了他们在这里设置的 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.) 我是否需要让第 3 方供应商更新其 postMessage() 回调中的路径? “.parent”实际上指向哪里? (如果这是一个嵌入式 iFrame?)并且有 DIV 的..等..等..等等容纳嵌套的 iFrame 内容?

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

3.) 我可以将它保持“原样”并以某种方式更改我的监听器中的路径/目标吗?

解决方案发布:

  • 这是一个 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
          });
    

最佳答案

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

这是一个 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
        });

关于event-listener - postMessage() 事件监听器不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46059804/

相关文章:

javascript - 如果我在 ffmpeg.js 上使用 Web Worker,如何获得正确的结果文件数据?

javascript - 如何使用window.postMessage动态嵌入iframe?

javascript - DropDown Open 上的 jquery 事件监听器

javascript - 页面加载时触发点击嵌入视频

javascript - Chrome 扩展程序获取新选择的标签页的 url

javascript - 由 javascript 为 Google map 图例创建的 html 元素的事件监听器不起作用

javascript - 从主页上的 iframe 发送消息

javascript - Trello API 发布新卡错误 - 无法在 'postMessage' 上执行 'DOMWindow'

javascript - 防止在密码字段中触发按键事件

javascript - 使用 Javascript、HTML5 的跨域 REST 代理