クロスドメインHTML5 iframeの問題とpostMessageによる解決策
クロスドメインiframeの問題とは
HTML5のiframeを利用する際、異なるドメイン間でデータをやり取りしようとすると、ブラウザの「同一オリジンポリシー(Same-Origin Policy)」によってアクセスが制限されます。これはセキュリティ上の重要な仕組みですが、正当な用途で親ページと子ページ(iframe内)の間で通信したい場合には障害となります。
このようなクロスドメイン環境でのデータ転送を実現するには、postMessage()メソッドを使用します。postMessageはHTML5で導入されたAPIで、オリジンが異なるウィンドウ間でも安全にメッセージを送受信できます。
実装例
以下のコード例を参考に、クロスドメインのHTML5 iframe問題を解決してみましょう。
// postMessage() を使用したデータ送信
window.onmessage = function(e) {
e.source.postMessage(document.body.innerHTML, e.origin);
};
// 受信側の処理
window.onmessage = function(event) {
alert(event.data);
};
// メッセージ送信の実行
document.getElementById('frame1').contentWindow.postMessage('', '*');コードの解説
このコードは以下のように動作します。
- window.onmessage: メッセージを受信した際に実行されるイベントハンドラです。受信したメッセージに対して、送信元(e.source)へドキュメントの内容を返信しています。
- e.origin: メッセージ送信元のオリジンを示します。セキュリティのため、返信先は必ず送信元のオリジンに限定しましょう。
- contentWindow.postMessage('', '*'): 指定したIDのiframeのコンテンツウィンドウへメッセージを送信します。第2引数の「*」は任意のオリジンを許可する指定ですが、本番環境では特定のオリジンを明示的に指定することが推奨されます。
注意点
postMessageを使用する際は、セキュリティに十分注意してください。「*」を指定するとすべてのオリジンからの通信を許可してしまうため、機密性の高いデータを扱う場合は、送信先のオリジンを正確に指定し、受信側でもevent.originを検証してからデータを処理することを推奨します。
-
Google ChromeでのHTML5 Canvasとz-indexの問題:fixed配置要素が正しく描画されないバグと解決策
問題の概要 position: fixed が設定された canvas 要素に z-index を適用すると、Google Chrome において position: fixed を持つ他のすべての要素が正しく描画されなくなる不具合が発生します。 注意すべき点として、この現象は canvas のサイズが 256×256px より大きい場合にのみ発生します。それ以下のサイズであれば、同様の問題は起こりません。 原因と背景 これは Chrome のレンダリングエンジンにおけるコンポジットレイヤー(合成レイヤー)の処理に関連する既知の挙動です。固定位置の大きな canvas に z-index を与
-
PhoneGap + Windows Phone 8:HTML5ビューポートのメタ設定とスケーリング問題の解決法
スケーリング問題が起きる原因 PhoneGapでWindows Phone 8向けのHTML5アプリを開発していると、ビューポートのスケーリングが意図したとおりに動作しないケースがあります。このような問題に直面した場合、その多くはCSSの記述方法に原因があります。ビューポートのメタタグだけでは不十分で、CSS側でも適切な設定を行う必要があるのです。 解決策1:CSSにzoomとcontent-zoomingを指定する まず試していただきたいのが、CSSに以下のスタイルを追加する方法です。 * { zoom: 1; -ms-content-zooming: none; } -m