ブラウザのドメイン間ソリューション
4476 ワード
同源政策とは、2つのサイトが異なる場合を指す.2つのWebサイトは、相手のサイトにアクセスできません.同源は何を満たす必要がありますか? プロトコル同じ ドメイン名同じ ポート同じ まず、よく使われるajaxのドメイン間需要についてお話しします. JSONP(JSONPはgetリクエストのみ送信) WebSocketWebSocketは、異なるソースポリシー をサポートします.
Cookie 両ページともdocumentを設定する.domain = 'liuwen.com'; ページのいずれかにdocumentが設定.cookie = 'name = louden' 別のページでこのcookie:var allCookie=documentを読みます.cookie;
iframe 2つのページが異なると相手のDOMが手に入らず、典型的な例はiframeウィンドウとwindowである.Openメソッドが開いているウィンドウは、親ウィンドウと通信できません. 親ウィンドウ取得子ウィンドウ: サブウィンドウ親ウィンドウの取得:
2つのウィンドウの1級ドメイン名が同じで、2級ドメイン名が異なる場合はdocumentを設定します.domainでいいです.
まったく異なるソースのWebサイトであれば、ドメイン間ウィンドウの通信問題を解決する3つの方法があります.フラグメントラベル フラグメントラベルはURLの#の後ろの部分、例えばhttp://163である.com/a.html#fragmentの#fragmentは、クリップマーカーを変更するだけではページが再リフレッシュされません.親ウィンドウは、情報をサブウィンドウのクリップマーカーに書き込むことができる: サブウィンドウはhashchangeイベントを傍受することによって通知することができる: 同様に、サブウィンドウは、親ウィンドウのフラグメントマーカー: を変更することもできる.
ブラウザウィンドウにwindowがあります.nameプロパティ、このプロパティの最大の特徴は、同じソースであるかどうかにかかわらず、同じウィンドウで前のページにこのプロパティが設定されている限り、後のページで読み取ることができることです.親ウィンドウはまずサブウィンドウを開き、windowに情報を書き込む異なるソースのページをロードする.nameプロパティ: サブウィンドウメインウィンドウと同じドメインのURLにジャンプ: その後、メインウィンドウはサブウィンドウのwindowを読み取ることができる.name了:
利点はwindowです.nameは容量が大きく、非常に長い文字列を置くことができます.欠点は、サブウィンドウwindowを傍受しなければならないことです.nameプロパティ値の変化は、ページのパフォーマンスに影響します.
window.postMessage
HTML 5の新しいAPI:ドキュメント間通信API.
親ウィンドウhttp://aaa.comサブウィンドウhttp://bbb.comメッセージを送信し、postMessageメソッドを呼び出せばいいです.
var popup = window.open('http://bbb.com', 'title');popup.postMessage('Hello World!', 'http://bbb.com');
PosetMessageメソッドの最初のパラメータは、メッセージを受信するウィンドウのソース、すなわち「プロトコル+ドメイン名+ポート」である具体的な情報内容である.ドメイン名を制限せず、すべてのウィンドウに送信することを示す*に設定することもできます.サブウィンドウ親ウィンドウにメッセージを送信する方法は似ています: 親ウィンドウと子ウィンドウはmessageイベントを通じて、相手のメッセージを傍受することができます:
Messageイベントのイベントオブジェクトeventには、次の3つのプロパティがあります.
次に、いくつかの例を示します.サブウィンドウはeventを通過する.ソース属性は親ウィンドウを参照し、情報を送信します: event.originプロパティは、このウィンドウを送信しない情報をフィルタできます:
1.cookie,IndexDB,LocalStorage
2.Dom
3.Ajax
JSONP , ,
1. script
function addScriptTag(src) {
var script = document.createElement('script');
script.setAttribute("type","text/javascript");
script.src = src;
document.body.appendChild(script);
}
window.onload = function () {
addScriptTag('http://example.com/ip?callback=foo');
}
function foo(data) {
console.log('Your public IP address is: ' + data.ip);
};
2. , :
foo({
"ip": "8.8.8.8"
});
Cookie , 。 , , document.domain Cookie。
document.getElementById("myIFrame").contentWindow.document
window.parent.document.body
2つのウィンドウの1級ドメイン名が同じで、2級ドメイン名が異なる場合はdocumentを設定します.domainでいいです.
まったく異なるソースのWebサイトであれば、ドメイン間ウィンドウの通信問題を解決する3つの方法があります.
-
- window.name
- API
var src = originURL + '#' + data;
document.getElementById('myIFrame').src = src;
window.onhashchange = checkMessage;
function checkMessage() {
var message = window.location.hash;
// ...
}
parent.location.href= target + "#" + hash;
window.name
ブラウザウィンドウにwindowがあります.nameプロパティ、このプロパティの最大の特徴は、同じソースであるかどうかにかかわらず、同じウィンドウで前のページにこのプロパティが設定されている限り、後のページで読み取ることができることです.
window.name = data;
location = 'http://parent.url.com/xx.html';
var data = document.getElementById('myFrame').contentWindow.name;
利点はwindowです.nameは容量が大きく、非常に長い文字列を置くことができます.欠点は、サブウィンドウwindowを傍受しなければならないことです.nameプロパティ値の変化は、ページのパフォーマンスに影響します.
window.postMessage
HTML 5の新しいAPI:ドキュメント間通信API.
親ウィンドウhttp://aaa.comサブウィンドウhttp://bbb.comメッセージを送信し、postMessageメソッドを呼び出せばいいです.
var popup = window.open('http://bbb.com', 'title');popup.postMessage('Hello World!', 'http://bbb.com');
PosetMessageメソッドの最初のパラメータは、メッセージを受信するウィンドウのソース、すなわち「プロトコル+ドメイン名+ポート」である具体的な情報内容である.ドメイン名を制限せず、すべてのウィンドウに送信することを示す*に設定することもできます.
window.opener.postMessage('Nice to see you', 'http://aaa.com');
window.addEventListener('message', function(e) {
console.log(e.data);
},false);
Messageイベントのイベントオブジェクトeventには、次の3つのプロパティがあります.
- event.source:
- event.origin:
- event.data:
次に、いくつかの例を示します.
window.addEventListener('message', receiveMessage);
function receiveMessage(event) {
event.source.postMessage('Nice to see you!', '*');
}
window.addEventListener('message', receiveMessage);
function receiveMessage(event) {
if (event.origin !== 'http://aaa.com') return;
if (event.data === 'Hello World') {
event.source.postMessage('Hello', event.origin);
} else {
console.log(event.data);
}
}