J'ai une application qui a une certaine page - appelons-la Page A. La page A est parfois une page de niveau supérieur, mais elle est aussi parfois intégrée comme un iframe dans la page B. Toutes les pages proviennent du même serveur et il n'y a pas problèmes interdomaines.
J'ai un script greasemonkey qui s'exécute sur la page A. Comment le script greasemonkey peut-il détecter si la page A se trouve dans le contexte iframe ou non?
La recherche de la longueur des trames tombe généralement en panne si la page A elle-même contient des trames (je sais que ce n'est peut-être pas le cas pour cette instance spécifique). Le test le plus fiable et le plus significatif serait:
if (window!=window.top) { /* I'm in a frame! */ }
Le prédicat
(window.parent.frames.length > 0)
vous dira exactement ce que vous voulez.
if (top === self) { not in a frame } else { in a frame }
Comme indiqué ci-dessus, la solution acceptée ne fonctionne pas dans IE8. De plus, la vérification de window.parent.frames.length
peut provoquer une exception interdomaine.
Au lieu de cela, j'ai pu y parvenir avec var isInIFrame = top.location != self.location
- il fonctionne dans IE8 et ne provoque pas de violation interdomaine tant que vous n'essayez pas de lire le contenu de top.location
.
Utilisation window.frameElement
et vérifiez s'il n'est pas nul et si son nodeName est "IFRAME".