Ich habe eine Seite mit einem Iframe mit externem Inhalt. Ich möchte nicht, dass Endlosschleifen im externen Inhalt meine gesamte Seite zum Absturz bringen. Gibt es eine Möglichkeit, dies zu umgehen?
Ich habe versucht, etwas einzurichten, bei dem der Elternteil den untergeordneten Iframe von Zeit zu Zeit postMessages und wenn der untergeordnete Iframe nicht zu lange antwortet, ändert der Elternteil den iframes src, aber dies scheint nicht zu funktionieren. Die setTimeout-Funktionen des übergeordneten Elements werden nicht mehr ausgeführt, sobald der Iframe eine Schleife beginnt. Siehe meinen Code hier (beachten Sie, dass Ihr Tab abstürzt, wenn Sie ihn ausführen. Öffnen Sie die Konsole vor der Ausführung, um die Protokollierung anzuzeigen):
<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>
Irgendwelche Vorschläge zur Lösung dieses Problems?
3 Antworten
Dies
console.log('killing');
iframe.src = '';
Tötet die iframe
nicht. Gemäß derselben Ursprungsrichtlinie können Sie keine externen Domains von Ihrer Domain aus manipulieren. Nur das Ändern des src
eines iframe
löst keine Navigation im iframe
aus. src
ändert sich, aber iframe
wird nicht navigiert.
Wenn Sie die Nachricht von inner iframe
erhalten, sollten Sie die iframe
aus Ihrem Dokumentbaum entfernen und eine neue in den Dokumentbaum einfügen, um den Iframe mit {{X2 zu töten }}
document.body.removeChild(iframe);
document.body.appendChild(newiframe);
Schauen Sie sich diese einfache Demonstration an, die ich hier erstellt habe: http://jsbin.com/avodeb/1/
Dies hängt stark vom Browser ab. Einige Browser verwenden einen Thread für jede Seite (oder jeden Iframe). In diesem Fall kann Ihr Skript erst ausgeführt werden, wenn die Iframe-Ausführung beendet ist (Endlosschleife). Einige andere haben einen Thread pro Seite (oder Iframe) und vielleicht können Sie das tun.
Ich bin mir sicher, dass Sie dies nicht können, wenn Sie erwarten, Unternehmensbrowser (wie IE8) zu unterstützen.
Versuche dies:
<script>
document.getElementById('iframeID').onload= function() { //When the iframe loads quickly
clearTimeout(killerTimer); // Stop the Killer Timer
};
var killerTimer = setTimeout( function() {
document.getElementById("iframeID").setAttribute("src",""); //Otherwise, kill the iframe
}, 3000 );
</script>