âåä¸ãªãªã¸ã³â (åä¸ãµã¤ã) ããªã·ã¼ã¯ãã¦ã£ã³ãã¦ã¨ãã¬ã¼ã ã®ã¢ã¯ã»ã¹ãäºãã«å¶éãã¾ãã
2ã¤ã®ã¦ã£ã³ãã¦ãéãã¦ããã¨ãã¾ã: 1ã¤ã¯ john-smith.comããã1ã¤ã¯ gmail.com ã§ãããã®å ´åãjohn-smith.com ãã¡ã¼ã«ãèªããããªã¹ã¯ãªããã¯æã¾ãªãã§ãããã
åä¸ãªãªã¸ã³(Same Origin)
åããããã³ã«ããã¡ã¤ã³ã¨ãã¼ããæã¤å ´åã2ã¤ã® URL 㯠âåä¸ãªãªã¸ã³â è¨ããã¾ãã
ãããã® URL ã¯ãã¹ã¦åããªãªã¸ã³ã§ã:
http://site.comhttp://site.com/http://site.com/my/page.html
ãããã¯éãã¾ã:
http://www.site.com(å¥ã®ãã¡ã¤ã³:www.ã®ãã)http://site.org(å¥ã®ãã¡ã¤ã³:.orgã®ãã)https://site.com(å¥ã®ãããã³ã«:https)http://site.com:8080(å¥ã®ãã¼ã:8080)
âåä¸ãªãªã¸ã³â ããªã·ã¼ã¯æ¬¡ã®ããã«ãªãã¾ã:
- å¥ã®ã¦ã£ã³ãã¦ã¸ã®åç
§ããã(e.g.
window.openã«ãã£ã¦ä½ããããããã¢ããããããã¯<iframe>å ã®ã¦ã£ã³ãã¦)ããã®ã¦ã£ã³ãã¦ãåä¸ãªãªã¸ã³ããæ¥ã¦ããå ´åã¯ããã®ã¦ã£ã³ãã¦ã¸ã®ãã«ã¢ã¯ã»ã¹ãæã¡ã¾ãã - ããã§ã¯ãªããå¥ã®ãªãªã¸ã³ããæ¥ããã®ã§ããå ´åããã®ã¦ã£ã³ãã¦ã®å
容ã«ã¢ã¯ã»ã¹ãããã¨ã¯ã§ãã¾ããã: 夿°ãããã¥ã¡ã³ãããã®ä»ãã¹ã¦ãå¯ä¸ã®ä¾å¤ã¯
locationã§ã: ããã¯å¤ãããã¨ãã§ãã¾ã(çµæãã¦ã¼ã¶ããªãã¤ã¬ã¯ããã¾ã)ãããããlocation ã èªã ãã¨ã¯ã§ãã¾ãã(ãããã£ã¦ãã¦ã¼ã¶ãä»ã©ãã«ããã®ããç¥ããã¨ã¯ã§ãããæ å ±ãæ¼ãããã¨ã¯ããã¾ãã)ã
ããã§ã¯ãããã¤ãä¾ãè¦ã¦ã¿ã¾ããããã¾ããåããªãªã¸ã³ããæ¥ã¦ãâåä¸ãªãªã¸ã³â ããªã·ã¼ã«è¡çªããªããã¼ã¸ãè¦ã¾ãããã®å¾ãâåä¸ãªãªã¸ã³â ããªã·ã¼ãåé¿ãããã¨ãã§ãããã¦ã£ã³ãã¦éã®ã¡ãã»ã¼ã¸ã³ã°ã«ã¤ãã¦èª¬æãã¾ãã
âåä¸ãªãªã¸ã³â ããªã·ã¼ã«ã¯ãå°ããªä¾å¤ãããã¾ãã
ã¦ã£ã³ãã¦ãåã第2ã¬ãã«ã®ãã¡ã¤ã³ãå
±æãã¦ããå ´åãä¾ãã° john.site.com, peter.site.com 㨠site.com (ãããã®å
±éã®ç¬¬ï¼ã¬ãã«ã®ãã¡ã¤ã³ã¯ site.com ã§ã)ãããã㯠âåä¸ãªãªã¸ã³â ããæ¥ã¦ãããã®ã¨ãã¦æ±ãäºãã§ãã¾ãã
ãããæ©è½ãããããã«ã¯ããã®ãããªãã¹ã¦ã®ãã¼ã¸(site.com ããã®ãã®ãå«ã)ã¯ã次ã®ã³ã¼ããå®è¡ããå¿
è¦ãããã¾ã:
document.domain = 'site.com';
ããã ãã§ããããã§å¶éãªãã«ããåããããã¨ãã§ãã¾ããç¹°ãè¿ãã¾ãããããã¯åã第2ã¬ãã«ã®ãã¡ã¤ã³ããã¤ãã¼ã¸ã§ã®ã¿å¯è½ã§ãã
iframe ã®ã³ã³ãã³ãã«ã¢ã¯ã»ã¹ãã
æåã®ä¾ã§ã¯ iframe ã説æãã¾ãã<iframe> ã¯äºé¢ã®ããç£ã§ãããã㯠<script> ããã㯠<img> ã¨åããããªåãªãã¿ã°ã§ãã䏿¹ãã¦ã£ã³ãã¦å
ã®ã¦ã£ã³ãã¦ã§ãã
åãè¾¼ã¿ã®ã¦ã£ã³ãã¦ã¯å¥ã® document 㨠window ãªãã¸ã§ã¯ããæã¡ã¾ãã
ããããã£ã使ã£ã¦ããããã«ã¢ã¯ã»ã¹ã§ãã¾ãã:
iframe.contentWindowã¯<iframe>å ã®ã¦ã£ã³ãã¦ã¸ã®åç §ã§ããiframe.contentDocumentã¯<iframe>å ã®ããã¥ã¡ã³ãã¸ã®åç §ã§ãã
åãè¾¼ã¿ã®ã¦ã£ã³ãã¦ã¸ã¢ã¯ã»ã¹ããéããã©ã¦ã¶ã¯ iframe ãåä¸ãªãªã¸ã³ãããã§ãã¯ãã¾ããããåä¸ã§ãªãå ´åãã¢ã¯ã»ã¹ã¯æå¦ããã¾ã(ä¸ã§è¿°ã¹ãä¾å¤ãé¤ã)ã
ä¾ãã°ãããã¯å¥ã®ãªãªã¸ã³ã® <iframe> ã§ãã:
<iframe src="https://example.com" id="iframe"></iframe>
<script>
iframe.onload = function() {
// å
é¨ã®ã¦ã£ã³ãã¦ã¸ã®åç
§ãåå¾ã§ãã¾ã
let iframeWindow = iframe.contentWindow;
try {
// ...ãããã®ä¸ã®ããã¥ã¡ã³ãã¯åå¾ã§ãã¾ãã
let doc = iframe.contentDocument;
} catch(e) {
alert(e); // ã»ãã¥ãªãã£ã¨ã©ã¼(å¥ãªãªã¸ã³)
}
// ãã®ä¸ã®ãã¼ã¸ã® URL ãè¦ããã¨ãã§ãã¾ãã
try {
alert(iframe.contentWindow.location);
} catch(e) {
alert(e); // ã»ãã¥ãªãã£ã¨ã©ã¼
}
// ...ãããã夿´(ããiframe å
ã«ãªã«ãããã¼ã)ãããã¨ã¯ã§ãã¾ã!
iframe.contentWindow.location = '/'; // åä½ãã¾ã
iframe.onload = null; // ä¸åº¦ã ãå®è¡ãããããã«ãã³ãã©ãã¯ãªã¢
};
</script>
ä¸ã®ã³ã¼ãã¯ã以ä¸ãé¤ãæä½ã«å¯¾ãã¦ã¨ã©ã¼ã表示ãã¾ãã:
- å
é¨ã®ã¦ã£ã³ãã¦
iframe.contentWindowã¸ã®åç §ãåå¾ãã - ãã®
locationã夿´ãã
iframe.onload vs iframe.contentWindow.onloadiframe.onload ã¤ãã³ãã¯å®éã«ã¯ iframe.contentWindow.onload ã¨åãã§ããããã¯åãè¾¼ã¿ã¦ã£ã³ãã¦ããã¹ã¦ã®ãªã½ã¼ã¹å«ãå®å
¨ã«èªã¿è¾¼ã¾ããæã«ããªã¬ã¼ããã¾ãã
â¦ããããiframe.onload ã¯å¸¸ã«å©ç¨å¯è½ãªä¸æ¹ãiframe.contentWindow.onload ã¯åä¸ãªãªã¸ã³ã§ããå¿
è¦ãããã¾ãã
ããã¦ãããã¯åä¸ãªãªã¸ã³ã®ä¾ã§ããåãè¾¼ã¿ã¦ã£ã³ãã¦ã§ãªãã§ãã§ãã¾ãã:
<iframe src="/" id="iframe"></iframe>
<script>
iframe.onload = function() {
// ãªãã§ãã§ãã¾ã
iframe.contentDocument.body.prepend("Hello, world!");
};
</script>
iframe ããã¼ããããã¾ã§å¾ ã£ã¦ãã ãã
iframe ã使ãããã¨ãããã«ããã¥ã¡ã³ããæã¡ã¾ãããããããã®ããã¥ã¡ã³ãã¯æçµçã«ããã«ãã¼ãããããã®ã¨ã¯ç°ãªãã¾ã!
ããã§è¦ã¦ãã ãã:
<iframe src="/" id="iframe"></iframe>
<script>
let oldDoc = iframe.contentDocument;
iframe.onload = function() {
let newDoc = iframe.contentDocument;
// ãã¼ããããããã¥ã¡ã³ãã¯åæã®ãã®ã¨ã¯åãã§ã¯ããã¾ãã!
alert(oldDoc == newDoc); // false
};
</script>
ããã¯å®éã«ãéçºè ã®éã§ããç¥ãããè½ã¨ãç©´ã§ãããã㯠ééã£ãããã¥ã¡ã³ã ãªã®ã§ãããã«ããã¥ã¡ã³ãã使ã£ãå¦çãããã¹ãã§ã¯ããã¾ãããããããã«ä»»æã®ã¤ãã³ããã³ãã©ãè¨å®ãã¦ãç¡è¦ããã¾ãã
â¦ããããonload ã¤ãã³ãã¯ãã¹ã¦ã®ãªã½ã¼ã¹ãå«ã iframe å
¨ä½ããã¼ããããã¨ãã«ããªã¬ã¼ããã¾ããä»®ã«ããæ©ããåãè¾¼ã¿ããã¥ã¡ã³ãã® DOMContentLoaded ã§ãªã«ããããå ´åã©ãããã°ããã§ããããï¼
iframe ãå¥ã®ãªãªã¸ã³ããæ¥ã¦ããå ´åã¯ä¸å¯è½ã§ããããããåä¸ãªãªã¸ã³ã®å ´åã¯ã次ã®ããã«æ°ããããã¥ã¡ã³ããç¾ããç¬éãæãã¦ãå¿ è¦ãªãã³ãã©ã®è¨å®ã試ã¿ããã¨ãã§ãã¾ãã:
<iframe src="/" id="iframe"></iframe>
<script>
let oldDoc = iframe.contentDocument;
// ããã¥ã¡ã³ããæ°ãããã®ã 100ms æ¯ã«ãã§ãã¯
let timer = setInterval(() => {
if (iframe.contentDocument == oldDoc) return;
// æ°ããããã¥ã¡ã³ããªã®ã§ããã³ãã©ãã»ãããã¾ã
iframe.contentDocument.addEventListener('DOMContentLoaded', () => {
iframe.contentDocument.body.prepend('Hello, world!');
});
clearInterval(timer); // ããå¿
è¦ãªãã®ã§ setInterval ãã¯ãªã¢ãã¾ã
}, 100);
</script>
ããè¯ãæ¹æ³ãç¥ã£ã¦ãããã³ã¡ã³ãã§æãã¦ãã ããã
window.frames
<iframe> ã®ã¦ã£ã³ãã¦ãªãã¸ã§ã¯ããåå¾ããå¥ã®æ¹æ³ã¯ãååä»ããããã³ã¬ã¯ã·ã§ã³ window.frames ããåå¾ãããã¨ã§ãã
- æ°å¤ã§:
window.frames[0]â ããã¥ã¡ã³ãã®1ã¤ç®ã®ãã¬ã¼ã ã®ã¦ã£ã³ãã¦ãªãã¸ã§ã¯ãã§ãã - ååã§:
window.frames.iframeNameâname="iframeName"ãæã¤ãã¬ã¼ã ã®ã¦ã£ã³ãã¦ãªãã¸ã§ã¯ãã§ãã
ä¾:
<iframe src="/" style="height:80px" name="win" id="iframe"></iframe>
<script>
alert(iframe.contentWindow == frames[0]); // true
alert(iframe.contentWindow == frames.win); // true
</script>
iframe ã¯å
å´ã«å¥ã® iframe ãæã¤å ´åãããã¾ãã対å¿ãã window ãªãã¸ã§ã¯ããé層ãå½¢æãã¾ãã
ããã²ã¼ã·ã§ã³ãªã³ã¯ã¯æ¬¡ã®ããã«ãªãã¾ã:
window.framesâ âåâ ã®ã¦ã£ã³ãã¦ã®ã³ã¬ã¯ã·ã§ã³(ãã¹ãããããã¬ã¼ã ç¨)window.parentâ â親â (å¤é¨ã®)ã¦ã£ã³ãã¦ã¸ã®åç §window.topâ ä¸çªä¸ã®ã¦ã£ã³ãã¦ã¸ã®åç §
ä¾:
window.frames[0].parent === window; // true
ç¾å¨ã®ããã¥ã¡ã³ãããã¬ã¼ã ã®ä¸ã§éããã¦ãããã©ããã確èªããã®ã«ãtop ããããã£ã使ãã¾ãã:
if (window == top) { // current window == window.top?
alert('The script is in the topmost window, not in a frame');
} else {
alert('The script runs in a frame!');
}
The sandbox attribute
sandbox 屿§ã¯ãä¿¡é ¼ã§ããªãã³ã¼ããå®è¡ãããã®ãé²ãããã<iframe> å
ã®ç¹å®ã®ã¢ã¯ã·ã§ã³ãé¤å¤ãããã¨ãã§ãã¾ããããããå¥ã®ãªãªã¸ã³ãããããã®ã¨ãã¦æ±ããã¨ã«ãã£ã¦ãã¾ãã¯ä»ã®å¶éãé©ç¨ãããã¨ã«ãã£ã¦ãiframeã âãµã³ãããã¯ã¹åâ ãã¾ãã
ããã©ã«ãã§ã¯ã<iframe sandbox src="..."> ã«å¯¾ãã¦ã¯ãâããã©ã«ãã»ããâ ã®å¶éã iframe ã«é©ç¨ããã¾ãããããã<iframe sandbox="allow-forms allow-popups"> ã®ããã«ã屿§ã®å¤ã« âé¤å¤ãããâ å¶éã®ãªã¹ããã¹ãã¼ã¹åºåãã§æå®ãããã¨ãã§ãã¾ãããã®å ´åãåæããã¦ããå¶éã¯é©ç¨ããã¾ããã
ã¤ã¾ãã空㮠"sandbox" 屿§ã¯æãå³ããå¶éã«ãããã¨ãæå³ããããããé¤å¤ããããã®ã®ãªã¹ããã¹ãã¼ã¹åºåãã§æå®ãããã¨ãã§ãã¾ãã
ããã¯å¶éã®ä¸è¦§ã§ã:
allow-same-origin- ããã©ã«ãã§ã¯ã
"sandbox"㯠iframe ã«å¯¾ããâç°ãªããªãªã¸ã³â ããªã·ã¼ãç¯æ£ãã¾ããã¤ã¾ãããã©ã¦ã¶ã¯ãã¨ã iframe ã®srcãåããµã¤ããæãã¦ããã¨ãã¦ããiframeãå¥ã®ãªãªã¸ã³ããæ¥ããã®ã¨ãã¦æ±ãã¾ããã¹ã¯ãªããã«å¯¾ãããã¹ã¦ã®æé»ã®å¶éãæã¡ã¾ãããã®ãªãã·ã§ã³ã¯ãã®æ©è½ãåé¤ãã¾ãã allow-top-navigationiframeãparent.locationã夿´ããã®ã許å¯ãã¾ããallow-formsiframeãããã©ã¼ã ãéä¿¡ããã®ã許å¯ãã¾ããallow-scriptsiframeããã¹ã¯ãªãããå®è¡ããã®ã許å¯ãã¾ããallow-popupsiframeããwindow.openããã®ã許å¯ãã¾ãã
ãã®ä»ã«ã¤ãã¦ã¯ãããã¥ã¢ã« ãåç §ãã¦ãã ããã
ä¸ã®ä¾ã¯ãå¶éã®ããã©ã«ãã»ãããé©ç¨ãããããµã³ãããã¯ã¹åããã iframe ã®ãã¢ã§ã: <iframe sandbox src="...">ããããã¯ããã¤ãã® JavaScript ã¨ãã©ã¼ã ãããã¾ãã
ä½ãåä½ããªããã¨ã«æ³¨ç®ãã¦ãã ãããããã©ã«ãã»ããã¯æ¬å½ã«å³ããã§ãã:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div>The iframe below is has <code>sandbox</code> attribute.</div>
<iframe sandbox src="sandboxed.html" style="height:60px;width:90%"></iframe>
</body>
</html><!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<button onclick="alert(123)">Click to run a script (doesn't work)</button>
<form action="http://google.com">
<input type="text">
<input type="submit" value="Submit (doesn't work)">
</form>
</body>
</html>"sandbox" 屿§ã®ç®çã¯ãå¶éã 追å ãããã¨ã ãã§ããããããåé¤ãããã¨ã¯ã§ãã¾ãããç¹ã«ãiframe ãå¥ãªãªã¸ã³ããæ¥ãã¨ãã«ãåä¸ãªãªã¸ã³å¶éãç·©ãããã¨ã¯ã§ãã¾ããã
ã¦ã£ã³ãã¦ãè·¨ãã ã¡ãã»ã¼ã¸ã³ã°
postMessage ã¤ã³ã¿ãã§ã¼ã¹ã¯ã©ã®ãªãªã¸ã³ããæ¥ã¦ããã¨ãã¦ããã¦ã£ã³ãã¦å士ãããåãããã®ãå¯è½ã«ãã¾ãã
ãããã£ã¦ããã㯠âåä¸ãªãªã¸ã³â ããªã·ã¼ã®åé¿çã§ãããã㯠john-smith.com ããã®ã¦ã£ã³ãã¦ã gmail.com ã¨ããåãããæ
å ±ã交æãããã¨ãå¯è½ã«ãã¾ããã両è
ãåæãã対å¿ãã JavaScript 颿°ãå¼ã³åºããã¨ãã ãã§ããããã¯å©ç¨è
ã«ã¨ã£ã¦ã¯å®å
¨ã§ãã
ã¤ã³ã¿ãã§ã¼ã¹ã¯ï¼ã¤ã®ãã¼ããããã¾ã:
postMessage
ã¡ãã»ã¼ã¸ãéãããã¦ã£ã³ãã¦ã¯ãåãåãã¦ã£ã³ãã¦ã® postMessage] ã¡ã½ãããå¼ã³åºãã¾ããã¤ã¾ããwin ã«ã¡ãã»ã¼ã¸ãéãããå ´åãwin.postMessage(data, targetOrigin) ãå¼ã³åºãå¿
è¦ãããã¾ãã
弿°:
data- éããã¼ã¿ãä»»æã®ãªãã¸ã§ã¯ããæå®å¯è½ã§ããã¼ã¿ã¯ âstructured cloning algorithmâ ãå©ç¨ãã¦è¤è£½ããã¾ããIE ã¯æååã®ã¿ããµãã¼ããã¦ããã®ã§ãIEããµãã¼ãããå ´åã¯ãè¤éãªãªãã¸ã§ã¯ãã«ã¯
JSON.stringifyãå¿ è¦ã§ãã targetOrigin- æå®ããããªãªã¸ã³ã®ã¦ã£ã³ãã¦ã ããã¡ãã»ã¼ã¸ãåãåãããã«ãã¿ã¼ã²ããã¦ã£ã³ãã¦ã®ãªãªã¸ã³ãæå®ãã¾ãã
targetOrigin ã¯å®å
¨å¯¾çã§ããæãåºãã¦ãã ãããã¿ã¼ã²ããã¦ã£ã³ãã¦ãå¥ã®ãªãªã¸ã³ããæ¥ãå ´åããã® location ãèªããã¨ã¯ã§ãã¾ããããã®ãããä»ã©ã®ãµã¤ããæå³ããã¦ã£ã³ãã¦ã§éããã¦ãããã夿ãããã¨ã¯ã§ãã¾ããã
targetOrigin ãæå®ããã¨ãã¦ã£ã³ãã¦ãã¾ã ãã®ãµã¤ãã表示ãã¦ããå ´åã«ã®ã¿ã¦ã£ã³ãã¦ããã¼ã¿ãåãåãããã«ãªãã¾ããæ©å¯æ§ãé«ããã¼ã¿ã®å ´åã«é©ãã¦ãã¾ãã
ä¾ãã°ãããã§ã¯ win ã¯ããªãªã¸ã³ http://example.com ããã®ããã¥ã¡ã³ããæã£ã¦ããå ´åã«ã®ã¿ãã¡ãã»ã¼ã¸ãåãåãã¾ãã
<iframe src="http://example.com" name="example">
<script>
let win = window.frames.example;
win.postMessage("message", "http://example.com");
</script>
ãã§ãã¯ããããªãå ´åã¯ãtargetOrigin ã« * ãè¨å®ãã¾ãã
<iframe src="http://example.com" name="example">
<script>
let win = window.frames.example;
win.postMessage("message", "*");
</script>
onmessage
ã¡ãã»ã¼ã¸ãåãåãããã«ã¯ãã¿ã¼ã²ããã¦ã£ã³ãã¦ã¯ message ã¤ãã³ãã®ãã³ãã©ãå¿
è¦ã§ãããã㯠postMessage ãå¼ã³åºãã(ãã㦠targetOrigin ãã§ãã¯ãæåãã)ã¨ãã«å®è¡ããã¾ãã
ã¤ãã³ããªãã¸ã§ã¯ãã¯ç¹å¥ãªããããã£ãæã£ã¦ãã¾ã:
datapostMessageããã®ãã¼ã¿ãorigin- éä¿¡å´ã®ãªãªã¸ã³ãä¾ãã°
http://javascript.infoã source- éä¿¡å´ã®ã¦ã£ã³ãã¦ã¸ã®åç
§ãå¿
è¦ãªãããã«
postMessageãè¿ããã¨ãã§ãã¾ãã
ãã³ãã©ãå²ãå½ã¦ãã«ã¯ãaddEventListener ã使ãå¿
è¦ãããã¾ããçç¸®æ§æ window.onmessage ã¯åä½ãã¾ããã
ä¾ã§ã:
window.addEventListener("message", function(event) {
if (event.origin != 'http://javascript.info') {
// æªç¥ã®ãã¡ã¤ã³ããã®å ´åã¯ç¡è¦ãã¾ããã
return;
}
alert( "received: " + event.data );
});
å®å ¨ãªä¾ã§ã:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
Receiving iframe.
<script>
window.addEventListener('message', function(event) {
alert(`Received ${event.data} from ${event.origin}`);
});
</script>
</body>
</html><!doctype html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<form id="form">
<input type="text" placeholder="Enter message" name="message">
<input type="submit" value="Click to send">
</form>
<iframe src="iframe.html" id="iframe" style="display:block;height:60px"></iframe>
<script>
form.onsubmit = function() {
iframe.contentWindow.postMessage(this.message.value, '*');
return false;
};
</script>
</body>
</html>postMessage 㨠message ã¤ãã³ãã®éã«ã¯é
å»¶ã¯ã¾ã£ããããã¾ããããããã¯åæçã«çºçããsetTimeout(...,0) ãããé«éã§ãã
ãµããª
ã¡ã½ãããå¼ã³ã ããå¥ã¦ã£ã³ãã¦ã®ã³ã³ãã³ãã«ã¢ã¯ã»ã¹ããã«ã¯ãæåã«ãã®åç §ãå¿ è¦ã§ãã
ãããã¢ããã®å ´åã2ã¤ã®ããããã£ãããã¾ã:
window.openâ æ°ããã¦ã£ã³ãã¦ãéããããã¸ã®åç §ãè¿ãã¾ããwindow.openerâ ãããã¢ããããè¦ãããããã¢ãããéããã¦ã£ã³ãã¦ã¸ã®åç §ã§ãã
iframe ã®å ´åãæ¬¡ã®ããã«ãã¦è¦ª/åã®ã¦ã£ã³ãã¦ã«ã¢ã¯ã»ã¹ã§ãã¾ã:
window.framesâ ãã¹ããããã¦ã£ã³ãã¦ãªãã¸ã§ã¯ãã®éåã§ããwindow.parent,window.topã親ãæä¸ä½ã®ã¦ã£ã³ãã¦ã¸ã®åç §ã§ããiframe.contentWindowã¯<iframe>ã¿ã°å ã®ã¦ã£ã³ãã¦ã§ãã
ããã¦ã£ã³ãã¦ãåä¸ãªãªã¸ã³ãå ±æãã¦ããå ´å(ãã¹ãããã¼ãããããã³ã«)ãã¦ã£ã³ãã¦ã¯äºãã«ãªãã§ãã§ãã¾ãã
ããã§ãªãå ´åãã§ãããã¨ã¯æ¬¡ã®ãã®ã ãã§ã:
- å¥ã¦ã£ã³ãã¦ã® location ã®å¤æ´(æ¸ãè¾¼ã¿ã®ã¿ã®ã¢ã¯ã»ã¹)ã
- ããã¸ã®ã¡ãã»ã¼ã¸ã®éä¿¡ã
é¤å¤ã«ã¤ãã¦ã¯ã次ã®éãã§ã:
- åã第2é層ã®ãã¡ã¤ã³ãå
±æãã¦ããã¦ã£ã³ãã¦:
a.site.comã¨b.site.comãããã¦ã両æ¹ã«document.domain='site.comãè¨å®ãããã¨ã§ããããã âåä¸ãªãªã¸ã³â ã®ç¶æ ã«ãã¾ãã - iframe ã
sandbox屿§ãæã£ã¦ããå ´åã屿§å¤ã«allow-same-originãæå®ããã¦ããªãéããå¼·å¶çã« âç°ãªããªãªã¸ã³â ã®ç¶æ ã«ç½®ããã¾ããããã¯åä¸ãµã¤ãããã® iframe å ã§ä¿¡é ¼ããã¦ããªãã³ã¼ããå®è¡ããã®ã«ä½¿ããã¾ãã
postMessage ã¤ã³ã¿ãã§ã¼ã¹ã§ã2ã¤ã®ã¦ã£ã³ãã¦éã§ã»ãã¥ãªãã£ãã§ãã¯ãå«ãããåããå¯è½ã§ãã
-
éä¿¡å´ã¯
targetWin.postMessage(data, targetOrigin)ãå¼ã³åºãã¾ãã -
targetOriginã'*'ã§ãªãå ´åããã©ã¦ã¶ã¯ã¦ã£ã³ãã¦targetWinãtargetWinãµã¤ãããã® URL ãã©ããããã§ãã¯ãã¾ãã -
ãã®å ´åã
targetWinã¯ç¹å¥ãªããããã£ãæã¤messageã¤ãã³ããããªã¬ã¼ãã¾ã:originâ éä¿¡å´ã®ã¦ã£ã³ãã¦ã®ãªãªã¸ã³(http://my.site.comãªã©)sourceâ éä¿¡å´ã®ã¦ã£ã³ãã¦ã¸ã®åç §dataâ ãã¼ã¿ãä»»æã®ãªãã¸ã§ã¯ããIEã ãã¯æååã®ã¿ããµãã¼ããã¾ãã
ã¿ã¼ã²ããã¦ã£ã³ãã¦å ã§ãã®ã¤ãã³ãã®ãã³ãã©ãè¨å®ããã«ã¯ã
addEventListenerã使ç¨ããå¿ è¦ãããã¾ãã

ã³ã¡ã³ã
<code>ã¿ã°ã使ã£ã¦ãã ãããè¤æ°è¡ã®å ´åã¯<pre>ãã10è¡ãè¶ ããå ´åã«ã¯ãµã³ãããã¯ã¹ã使ã£ã¦ãã ãã(plnkr, JSBin, codepenâ¦)ã