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?

7
asutherland 9 Okt. 2012 im 01:32

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/

0
Mohsen 8 Okt. 2012 im 21:46

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.

0
A. Matías Quezada 8 Okt. 2012 im 21:37

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>
0
mukama 8 Okt. 2012 im 22:33