Détectez quand l'iframe est un domaine interdisciplinaire, puis débrouillez-le

J'ai une page avec un grand iframe qui contient une majorité du contenu. L'utilisateur interagit avec le site Web en cliquant autour de l'iframe. La fonctionnalité que j'essaie de construire est: lorsqu'un utilisateur navigue loin de mon site, je les fais une faveur et je me retire de l'iframe.

L'iframe a un événement onload qui est déclenché chaque fois qu'une nouvelle page est chargée, à travers le domaine ou non.

<iframe id="testframe" src="http://mysite.com" onload="testframe_loaded()"></iframe> 

Chaque fois que l'événement est tiré, je cherche un moyen de:

A ) Détecter lorsque l'utilisateur navigue vers un domaine différent

B ) Bust hors de l'iframe.

Je soupçonne que B n'est pas possible, puisque les navigateurs ne donnent pas accès à

 document.getElementById("testframe").contentDocument.location.href 

Lorsque l'iframe est un domaine interdisciplinaire. Je ne sais pas non plus si oui ou non.

Si quelqu'un a des idées quant à la façon d'accomplir cela, ou est positif qu'il ne puisse pas être fait, j'apprécierais le conseil.

Merci

Vous pouvez faire A, car si vous obtenez une erreur de sécurité (ce que vous pouvez attraper), cela signifie qu'ils sont multi-domaines 🙂 Ensuite, vous pouvez redimensionner l'iframe pour être la page entière. Mais je pense que vous avez raison, vous ne pouvez pas résister à la rupture, sans coopération explicite de l'autre domaine.

EDIT: Vous avez raison, vous n'avez pas besoin de faire un sondage. Voici le code de base:

 <html> <head> <title>Cross-domain frame test</title> <!-- http://stackoverflow.com/questions/2365822/detect-when-iframe-is-cross-domain-then-bust-out-of-it/2365853#2365853 --> <script type="text/javascript"> function checkForCross() { var iframe = document.getElementById("myFrame"); try { var loc = iframe.contentDocument.location.href; } catch(e) { iframe.setAttribute("style", "border: 0; margin: 0; padding: 0; height: 100%; width: 100%;"); } } </script> </head> <body> <iframe name="myFrame" id="myFrame" src="child.html" style="height: 50%; width: 50%;" onload="checkForCross()"></iframe> </body> </html> 

Définissez l'attribut 'target' sur les liens externes vers '_top'.

Cela fonctionne pour Chrome au moins (pas testeur sur d'autres navigateurs)

  if(parent.location.host != undefined){ alert("hello world!"); }else{ throw "cannot access parent!"; } 

Il va toujours lancer l'avertissement "unsafe javascript attempt" , mais cela n'arrête pas l'exécution du code. Au lieu de cela, la variable est renvoyée comme non définie.