2010-03-02 3 views
12

J'ai une page avec un grand iframe qui contient la majorité du contenu. L'utilisateur interagit avec le site en cliquant dans l'iframe. La fonctionnalité que j'essaye de construire est: Quand un utilisateur navigue loin de mon site, je leur fais une faveur et sort de l'iframe. L'iframe a un événement onload qui est déclenché chaque fois qu'une nouvelle page est chargée, cross-domain ou non.Détecter si l'iframe est inter-domaine, puis en sortir

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

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

A) détecter lorsque l'utilisateur accède à un domaine différent

B) du buste de l'iframe.

Je soupçonne que B ne soit pas possible, car les navigateurs ne donnent pas accès à

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

lorsque l'iframe est inter-domaines. Je ne suis pas sûr non plus si A est possible.

Si quelqu'un a des idées sur la façon d'accomplir ceci, ou est positif que cela ne peut pas être fait, j'apprécierais le conseil.

Merci

Répondre

7

Vous pouvez faire, car si vous obtenez une erreur de sécurité (que vous pouvez attraper), qu'ils est des moyens sont inter-domaines :) Ensuite, vous pouvez redimensionner l'iframe à la page entière. Mais je pense que vous avez raison de dire que vous ne pouvez pas vous en sortir, sans la coopération explicite de l'autre domaine.

EDIT: Vous avez raison, vous n'avez pas besoin d'interroger. 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> 
+1

Je vais tester l'approche try/catch .. J'oublie toujours que JavaScript supporte cela :) L'interrogation n'est pas nécessaire, puisque je peux la tester à chaque fois que l'onfame de l'événement onload est déclenché. – Emmett

+0

Cela fonctionne définitivement et démontre que A est possible. Malheureusement, B semble toujours impossible - l'expansion des travaux iframe, mais il est toujours bancale parce que l'URL dans la barre d'adresse du navigateur ne correspondra pas au site affiché. Je vais essayer de jouer un peu avec des solutions impliquant la modification des liens que les autres réponses suggèrent, par exemple. attacher un gestionnaire de clic à chaque lien qui vérifie si l'attribut href est inter-domaine. – Emmett

+0

Emmett, le gestionnaire de clic fonctionne, mais seulement pour/your/links, pas de liens dans l'iframe. –

2

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

+0

Ce que vous pouvez faire lorsque vous ne traversez pas le domaine en parcourant la nomenclature. – Joshua

1

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

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

Il sera toujours jeter l'avertissement "unsafe javascript attempt", mais cela ne stoppe pas l'exécution de code. Au lieu de cela, la variable est renvoyée comme non définie.