2017-09-05 37 views
0

私は、ホスティングされたビデオ再生を表示するためにiFrameに入れるURLを提供するサードパーティと協力しています。postMessage()イベントリスナーが機能しない

  • これは、彼らが選択

の彼らのプレーヤーとしてJWPlayerを使用し、クロスドメイン

  • である私は、ビデオの再生が完了したときを「知る」ための方法を要求しました。読んで、postMessage()コールバックが多くのものを使用しているように見え、第3ベンダーが提案したものであり、実装すると述べたものです。

    私はこの「コールバック」機能を持っているTEST URLを与えられました...そして、私がそれを使用できるかどうかを確認するために。

    コールバック/リスナー機能からアラートが表示されないようですか?

    私はこれを初めて実装しているので、エラーが自分の目的であるかどうかはわかりません。 私はそれがpostMessage()関数のパス形式かもしれないと思っていますか?

    コードをfirebugging後..私は最終的にはここで設定自分のJS /コールバックを資金:

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

    私の質問:物事の

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

    私の側には、単純なイベントリスナーはそうのように追加しました次のとおりです。

    1. これはなぜ機能しませんか?ターゲット/スコープの問題?
    2. 第三者ベンダーにpostMessage()コールバックのパスを更新させる必要がありますか? '.parent'は実際にどこを指していますか? (これが埋め込まれたiFrameの場合)、入れ子にされたiFrameコンテンツを格納するDIVなどがありますか?

      私のリスナー機能は、この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 
         }); 
    
    関連する問題