外部コンテンツを含むiframeを含むページがあります。外部コンテンツの無限ループによってページ全体がクラッシュすることは望ましくありません。これを回避する方法はありますか?
親が子iframeに頻繁にpostMessagesするように設定しようとしましたが、子Iframeが長時間応答しない場合、親はiframe srcを変更しますが、これは機能しないようです。iframeがループを開始すると、親のsetTimeout関数は実行されなくなります。ここで私のコードを参照してください(実行するとタブがクラッシュすることに注意してください。実行する前にコンソールを開いてログを表示してください):
<html>
<head>
</head>
<body>
<script type="text/javascript">
var scr = 'script';
var html = '<html><head><script>\n' +
' window.addEventListener("message", answer, false);' +
' function answer() { console.log("answered"); parent.postMessage(\'hi\', \'*\');}' +
' setTimeout("while(1){console.log(\'in loop\')};", 3000)' +
"</" + scr + "></head><body>IFRAME</body</html>";
var lastAnswer = (new Date()).getTime();
var iframe = document.createElement('iframe');
queryChild();
window.addEventListener("message", receive, false);
function receive() {
lastAnswer = (new Date()).getTime();
console.log('got answer');
}
function queryChild() {
console.log('querying');
if((new Date()).getTime() - lastAnswer > 5000) {
console.log('killing');
iframe.src = '';
} else if(iframe.contentWindow){
iframe.contentWindow.postMessage('hi', '*');
}
setTimeout(queryChild, 2000);
};
document.body.appendChild(iframe);
iframe.contentWindow.document.open();
iframe.contentWindow.document.write(html);
iframe.contentWindow.document.close();
</script>
</body>
</html>
この問題を解決する方法について何か提案はありますか?