2009-05-29 4 views
47

J'ai une application qui a une certaine page - appelons-la Page A. La page A est parfois une page de haut niveau, mais est aussi parfois incorporée comme une iframe dans la page B. Toutes les pages viennent à partir du même serveur et il n'y a pas de problèmes inter-domaines.Détecter l'incorporation d'iFrame en Javascript

J'ai un script greasemonkey qui s'exécute à la page A. Comment le script greasemonkey peut-il détecter si la page A est dans le contexte iframe ou pas?

+0

Souhaitez-vous simplement chercher au parent pour les cadres et voir s'ils existent? – 76mel

+0

Copie possible de [Comment identifier si une page Web est en cours de chargement dans un iframe ou directement dans la fenêtre du navigateur?] (Http://stackoverflow.com/questions/326069/how-to-identify-if-a-webpage- est-être-chargé-dans-un-iframe-ou-directement-dans-t) – feeela

Répondre

111

Si l'on regarde la longueur d'une image, elle se décompose généralement si la page A elle-même contient des images (je sais que cela pourrait ne pas être le cas pour cette instance spécifique). Le test plus fiable et significative serait:

if (window!=window.top) { /* I'm in a frame! */ } 
+0

Pouvez-vous expliquer? Est-ce parce que a.parent peut égaler un? – Cheekysoft

+5

oui, exactement ainsi - .top et .parent peuvent pointer vers le même objet que .self (et en fait il serait peut-être plus clair de tester window.self! = Window.top) – annakata

+0

Cela n'a pas fonctionné pour moi dans un Firefox extension, mais j'ai trouvé une solution différente: http://stackoverflow.com/questions/326069#7769187 – magnoz

11

Le prédicat

(window.parent.frames.length > 0) 

vous dira tout ce que vous voulez.

+0

quel site cool! +1 pour cela – 76mel

+1

Ne oubliez pas de le faire après; 0) –

+3

Cette approche vous donne un faux positif si vous imbriquez un autre iframe sur la page que vous exécutez cette vérification. –

0

Utilisez window.frameElement et vérifier si elle est non nulle et si son nodeName est "IFRAME".

+1

Cet élément n'est pas disponible dans Safari ou Opera. Compte tenu du nombre de personnes surfant sur iPads ces jours-ci, ce n'est probablement pas une solution appropriée. – Ash

4

Comme indiqué ci-dessus, la solution acceptée ne fonctionne pas dans IE8. En outre, la vérification window.parent.frames.length peut provoquer une exception interdomaine.

Au lieu de cela, j'ai été en mesure de réaliser cela avec var isInIFrame = top.location != self.location - cela fonctionne dans IE8 et il ne provoque pas de violation de domaine tant que vous n'essayez pas de lire le contenu de top.location.

Questions connexes