PostMessageはどれほど使いやすいのか
3631 ワード
postMessageとは何ですか?
postMessage()メソッドでは、異なるソースからのスクリプトが非同期で限られた通信を行うことができ、テキスト・アーカイブ、マルチウィンドウ、ドメイン間メッセージングを実現することができます.
Html 5のpostMessageはドメイン間、ウィンドウ間メッセージングを解決する
postMessageのメリットドメイン間ページの2つのメッセージング マルチウィンドウ間のメッセージング ネストiframeのデータ転送 postMessage()
postMessage()メソッドでは、異なるソースからのスクリプトが非同期で限られた通信を行うことができ、テキスト・アーカイブ、マルチウィンドウ、ドメイン間メッセージングを実現することができます. data:転送するデータ、html 5仕様ではこのパラメータはJavaScriptの任意の基本タイプまたはコピー可能なオブジェクトであってもよいが、すべてのブラウザがこれを行ったわけではなく、一部のブラウザでは文字列パラメータしか処理できないため、パラメータを転送する際にJSONを使用する必要がある.stringify()メソッドはオブジェクトパラメータをシーケンス化し、低バージョンIEでjson 2を参照する.jsは類似の効果を実現することができる. origin:文字列パラメータ、ターゲットウィンドウのソースを示す、プロトコル+ホスト+ポート番号[+URL]、URLは無視されるので書かなくてもいい、このパラメータは安全のため、postMessage()メソッドは指定ウィンドウにメッセージのみを渡す、もちろんパラメータを「*」に設定して任意のウィンドウに渡すことができる、現在のウィンドウと同じソースを指定する場合は「/」に設定します.
例:
メッセージイベントをBページで傍受し、渡されたデータを取得する
このような伝達と受け入れのプロセスによって、完全なメッセージングを実現することができる.A,Bがドメイン間であるか,ネスト関係があるかにかかわらず,postMessageを用いてメッセージングを実現することができる.
MessageEventのプロパティ data:ソースから渡されたmessage source:メッセージを送信するウィンドウオブジェクト origin:メッセージウィンドウを送信するソース(プロトコル+ホスト+ポート番号) いくつかのソースから送信されたメッセージのみを処理する場合、originを使用して判断し、いくつかのソースのmessageのみを処理することで、不要な値をフィルタリングするのに便利です.
問題を解決する
最近、自分のコード【A_child】はIframe方式でAシステムに置かれている問題があります.コードにはAシステムのログイン時のユーザー情報が必要なので、Aシステムのクッキー情報が必要です.現在の処理方法は、私のコードをAシステムのサーバに配備し、異なるポートを指定することで、iframeを埋め込むことでクッキー共有を実現します.しかし欠点は、コードを更新するたびにAシステムの担当者が更新する必要があることです.大量の人力と時間のコストを費やした.
注意:同じドメイン名で、異なるポートでクッキー情報を共有できます.
最近、自分の仕事の負担を軽減するために、中間層のページを書くことにしました.Aシステムの下に置いて、メニューの指向は変わりません.中間層のページの中でiframeを1回ネストして、このページでAシステムのクッキー情報をpostMessageでorigin側に送信します.
注意:自分のコードが入るときはユーザー情報を持ってテーブルデータを要求する必要があるので、ページのすべての操作はmessageを受け取ってから行わなければなりません.次のコードがあります
もちろん,ネストiframeがドメイン間で値を伝達する問題を解決するには,他の2つの方法がある. hash値を使用して、iframeのsrcのhashに渡す必要がある値dataを配置します. サブページは親ページに値を伝達し、Cページ【CとAが必要なときは同ドメインの】を借りて、AにBをネストし、BにCをネストし、BにAを伝達するには、CをイベントBUSとして使用し、BのデータはまずCに伝達され、その後、Cを通じてAにデータを伝達することができる.【この方法は篠篠篠さんが使ったことがないでしょう】という方法です.
まとめ
html 5の新しい特性は、postMessageが主にマルチページのメッセージングをより容易に解決し、ドメイン間の問題を効果的に解決することです.使いやすくなった.しかし、自分のニーズに応じて異なる処理方法を選択します.
WeChatの公式アカウントへようこそ
転載先:https://juejin.im/post/5c3efccef265da61290a6a3e
postMessage()メソッドでは、異なるソースからのスクリプトが非同期で限られた通信を行うことができ、テキスト・アーカイブ、マルチウィンドウ、ドメイン間メッセージングを実現することができます.
Html 5のpostMessageはドメイン間、ウィンドウ間メッセージングを解決する
postMessageのメリット
postMessage()メソッドでは、異なるソースからのスクリプトが非同期で限られた通信を行うことができ、テキスト・アーカイブ、マルチウィンドウ、ドメイン間メッセージングを実現することができます.
postMessage(data,origin)
例:
// A [http://a.com]
const data = document.getElementById('name').value;
window.frames[0].postMessage(data,'http://b.com');
メッセージイベントをBページで傍受し、渡されたデータを取得する
// B [http://b.com]
window.addEventListener('message', function(ev) {
// , , ,
if (ev.source !== window.parent) return;
var data = ev.data;
console.info('message from parent:', data);
}, false);
このような伝達と受け入れのプロセスによって、完全なメッセージングを実現することができる.A,Bがドメイン間であるか,ネスト関係があるかにかかわらず,postMessageを用いてメッセージングを実現することができる.
MessageEventのプロパティ
問題を解決する
最近、自分のコード【A_child】はIframe方式でAシステムに置かれている問題があります.コードにはAシステムのログイン時のユーザー情報が必要なので、Aシステムのクッキー情報が必要です.現在の処理方法は、私のコードをAシステムのサーバに配備し、異なるポートを指定することで、iframeを埋め込むことでクッキー共有を実現します.しかし欠点は、コードを更新するたびにAシステムの担当者が更新する必要があることです.大量の人力と時間のコストを費やした.
注意:同じドメイン名で、異なるポートでクッキー情報を共有できます.
最近、自分の仕事の負担を軽減するために、中間層のページを書くことにしました.Aシステムの下に置いて、メニューの指向は変わりません.中間層のページの中でiframeを1回ネストして、このページでAシステムのクッキー情報をpostMessageでorigin側に送信します.
注意:自分のコードが入るときはユーザー情報を持ってテーブルデータを要求する必要があるので、ページのすべての操作はmessageを受け取ってから行わなければなりません.次のコードがあります
window.addEventListener('message', (ev) => {
if (ev.source !== window.parent) return;
const data = ev.data;
...
...
...
Vue.prototype.userInfo = data;
new Vue({
el: '#app',
router,
store,
render: h => h(renderComponents),
});
}, false);
もちろん,ネストiframeがドメイン間で値を伝達する問題を解決するには,他の2つの方法がある.
まとめ
html 5の新しい特性は、postMessageが主にマルチページのメッセージングをより容易に解決し、ドメイン間の問題を効果的に解決することです.使いやすくなった.しかし、自分のニーズに応じて異なる処理方法を選択します.
WeChatの公式アカウントへようこそ
転載先:https://juejin.im/post/5c3efccef265da61290a6a3e