Html5-web-messaging

提供:Dev Guides
移動先:案内検索

HTML5-Webメッセージング

Webメッセージングは​​、ドキュメントがブラウジングコンテキストを分離し、Domなしでデータを共有する方法です。 異なるドメイン、プロトコル、またはポートでのクロスドメイン通信の問題を無効にします

たとえば、iframeまたはvoice-versaに配置されている広告コンテナにページからデータを送信する場合、このシナリオでは、ブラウザーはセキュリティ例外をスローします。 Webメッセージングを使用すると、データをメッセージイベントとして渡すことができます。

メッセージイベント

メッセージイベントは、ドキュメント間メッセージング、チャネルメッセージング、サーバー送信イベント、およびWeb Sockets.itを起動します。

属性

Sr.No. Attributes & Description
1

data

文字列データが含まれています

2

origin

ドメイン名とポートが含まれています

3

lastEventId

現在のメッセージイベントの一意の識別子が含まれます。

4

source

元のドキュメントのウィンドウへの参照を含む

5

ports

任意のメッセージポートによって送信されるデータが含まれます

クロスドキュメントメッセージを送信する

クロスドキュメントメッセージを送信する前に、新しいiframeまたは新しいウィンドウを作成して、新しいWebブラウジングコンテキストを作成する必要があります。 postMessage()を使用してデータを送信でき、2つの引数があります。 彼らは-

  • message -送信するメッセージ
  • targetOrigin -オリジン名

iframeからボタンにメッセージを送信する

var iframe = document.querySelector('iframe');
var button = document.querySelector('button');

var clickHandler = function() {
   iframe.contentWindow.postMessage('The message to send.',
      'https://www.finddevguides.com);
}
button.addEventListener('click',clickHandler,false);

受信ドキュメントでクロスドキュメントメッセージを受信する

var messageEventHandler = function(event){

  //check that the origin is one we want.
   if(event.origin == 'https://www.finddevguides.com') {
      alert(event.data);
   }
}
window.addEventListener('message', messageEventHandler,false);

チャンネルメッセージング

ブラウジングコンテキスト間の双方向通信は、チャネルメッセージングと呼ばれます。 複数のオリジン間の通信に役立ちます。

MessageChannelおよびMessagePortオブジェクト

messageChannelの作成中に、データを送信するための2つのポートを内部で作成し、別のブラウジングコンテキストに転送します。

  • * postMessage()*-メッセージスローチャネルを投稿する
  • * start()*-データを送信します
  • * close()*-ポートを閉じます

このシナリオでは、1つのiframeから別のiframeにデータを送信しています。 ここでは、関数内のデータを呼び出し、データをDOMに渡します。

var loadHandler = function() {
   var mc, portMessageHandler;
   mc = new MessageChannel();
   window.parent.postMessage('documentAHasLoaded','http://foo.example',[mc.port2]);

   portMessageHandler = function(portMsgEvent) {
      alert( portMsgEvent.data );
   }

   mc.port1.addEventListener('message', portMessageHandler, false);
   mc.port1.start();
}
window.addEventListener('DOMContentLoaded', loadHandler, false);

上記のコードでは、ポート2からデータを取得していますが、データは2番目のiframeに渡されます

var loadHandler = function() {
   var iframes, messageHandler;
   iframes = window.frames;

   messageHandler = function(messageEvent) {

      if( messageEvent.ports.length > 0 ) {

        //transfer the port to iframe[1]
         iframes[1].postMessage('portopen','http://foo.example',messageEvent.ports);
      }
   }
   window.addEventListener('message',messageHandler,false);
}
window.addEventListener('DOMContentLoaded',loadHandler,false);

これで、2番目のドキュメントがportMsgHandler関数を使用してデータを処理します。

var loadHandler() {

  //Define our message handler function
   var messageHandler = function(messageEvent) {

     //Our form submission handler

      var formHandler = function() {
         var msg = 'add <[email protected]> to game circle.';
         messageEvent.ports[0].postMessage(msg);
      }
      document.forms[0].addEventListener('submit',formHandler,false);
   }
   window.addEventListener('message',messageHandler,false);
}
window.addEventListener('DOMContentLoaded',loadHandler,false);