J'écris une application facebook basée sur iframe. Maintenant, je veux utiliser la même page html pour rendre le site Web normal ainsi que la page de toile dans Facebook. Je veux savoir si je peux déterminer si la page a été chargée dans l'iframe ou directement dans le navigateur?
javascript
facebook
iframe
akshat
la source
la source
Réponses:
Les navigateurs peuvent bloquer l'accès en
window.top
raison de la même politique d'origine . Des bogues IE ont également lieu. Voici le code de travail:top
etself
sont les deuxwindow
objets (avecparent
), vous voyez donc si votre fenêtre est la fenêtre supérieure.la source
window.self !== window.top
revienttrue
quand il est exécuté à partir du contenu deframe
, ouiframe
.Lorsqu'elle se trouve dans une iframe de la même origine que le parent, la
window.frameElement
méthode renvoie l'élément (par exemple,iframe
ouobject
) dans lequel la fenêtre est incorporée. Sinon, si la navigation dans un contexte de niveau supérieur, ou si le parent et le cadre enfant ont des origines différentes, il sera évaluénull
.Il s'agit d'une norme HTML avec une prise en charge de base dans tous les navigateurs modernes.
la source
frameElement
lèvera une exception SecurityError dans les iframes d'origine croisée, selon W3C ( WHATWG dit qu'il devrait retourner null à la place). Vous voudrez donc peut-être l'envelopper dans unetry...catch
déclaration.null
et sortir deiframe
Returns the element (such as <iframe> or <object>) in which the window is embedded, or null if the element is either top-level or is embedded into a document with a different script origin; that is, in cross-origin situations.
RoBorg est correct, mais je voulais ajouter une note latérale.
Dans IE7 / IE8, lorsque Microsoft a ajouté des onglets à son navigateur, il a cassé une chose qui causera des ravages avec votre JS si vous ne faites pas attention.
Imaginez cette mise en page:
Maintenant, dans le cadre "baz", vous cliquez sur un lien (pas de cible, se charge dans le cadre "baz"), cela fonctionne bien.
Si la page qui est chargée, appelons-la special.html, utilise JS pour vérifier si "it" a un cadre parent nommé "bar", il retournera true (attendu).
Disons maintenant que la page special.html lors de son chargement, vérifie le cadre parent (pour l'existence et son nom, et s'il s'agit de "bar", elle se recharge dans le cadre de la barre. Ex.
Jusqu'ici tout va bien. Maintenant vient le bug.
Disons qu'au lieu de cliquer sur le lien d'origine comme d'habitude, et de charger la page special.html dans le cadre "baz", vous avez cliqué avec le bouton du milieu ou choisi de l'ouvrir dans un nouvel onglet.
Lorsque ce nouvel onglet se charge ( sans aucun cadre parent! ), IE entrera dans une boucle sans fin de chargement de page! car IE "copie" la structure du cadre en JavaScript de telle sorte que le nouvel onglet A un parent et que ce parent A le nom "bar".
La bonne nouvelle, c'est que la vérification:
dans ce nouvel onglet retourne vrai, et donc vous pouvez tester cette condition étrange.
la source
window.parent
.La réponse acceptée n'a pas fonctionné pour moi dans le script de contenu d'une extension Firefox 6.0 (Addon-SDK 1.0): Firefox exécute le script de contenu dans chacun: la fenêtre de niveau supérieur et dans tous les iframes.
Dans le script de contenu, j'obtiens les résultats suivants:
La chose étrange à propos de cette sortie est qu'elle est toujours la même, que le code soit exécuté à l'intérieur d'une iframe ou de la fenêtre de niveau supérieur.
D'un autre côté, Google Chrome semble exécuter mon script de contenu une seule fois dans la fenêtre de niveau supérieur, de sorte que ce qui précède ne fonctionnerait pas du tout.
Ce qui a finalement fonctionné pour moi dans un script de contenu dans les deux navigateurs est le suivant:
Sans iframes, cela s'imprime
0:0
, dans une fenêtre de niveau supérieur contenant un cadre qu'il imprime1:1
et dans la seule iframe d'un document qu'il imprime0:1
.Cela permet à mon extension de déterminer dans les deux navigateurs s'il y a des iframes présents, et en plus dans Firefox si elle est exécutée dans l'un des iframes.
la source
document.defaultView.self === document.defaultView.top
ouwindow !== window.top
. Dans le script de contenu du module complémentaire SDK de Firefox, l'self
objet global est un objet utilisé pour communiquer avec le script principal.Je ne sais pas comment cet exemple fonctionne pour les anciens navigateurs Web, mais je l'utilise pour IE, Firefox et Chrome sans et problème:
la source
!(window===window.parent)
J'utilise ceci:
la source
.indexOf("HTMLIFrameElement")
:?Utilisez cette fonction javascript comme exemple sur la façon d'accomplir cela.
la source
Meilleur script de rupture de trame de navigateur hérité
Les autres solutions n'ont pas fonctionné pour moi. Celui-ci fonctionne sur tous les navigateurs:
Une façon de se défendre contre le détournement de clics consiste à inclure un script "frame-breaker" dans chaque page qui ne doit pas être encadrée. La méthodologie suivante empêchera une page Web d'être encadrée même dans les navigateurs hérités, qui ne prennent pas en charge l'en-tête X-Frame-Options.
Dans l'élément HEAD du document, ajoutez ce qui suit:
Appliquez d'abord un ID à l'élément de style lui-même:
De cette façon, tout peut être dans le document HEAD et vous n'avez besoin que d'une méthode / taglib dans votre API.
Référence: https://www.codemagi.com/blog/post/194
la source
la source
Puisque vous posez la question dans le contexte d'une application Facebook, vous voudrez peut-être envisager de détecter cela sur le serveur lors de la demande initiale. Facebook transmettra un tas de données de chaîne de requête, y compris la clé fb_sig_user si elle est appelée à partir d'un iframe.
Étant donné que vous devez probablement vérifier et utiliser ces données de toute façon dans votre application, utilisez-les pour déterminer le contexte approprié à rendre.
la source
En fait, je vérifiais window.parent et cela a fonctionné pour moi, mais dernièrement, window est un objet cyclique et a toujours une clé parent, iframe ou no iframe.
Comme les commentaires suggèrent une comparaison difficile avec les travaux de window.parent. Je ne sais pas si cela fonctionnera si iframe est exactement la même page Web que le parent.
la source
window.parent === window
est vrai. Votre réponse est donc incorrecte. Et cette comparaison pourrait être utilisée pour la vérification (au moins dans Chrome, ne l'a pas testée dans d'autres navigateurs).C'est un ancien morceau de code que j'ai utilisé plusieurs fois:
la source
(parent.location == self.location)
parent.location
. Sinon, une exception est levéeSi vous voulez savoir si l'utilisateur accède à votre application à partir de l'onglet de la page Facebook ou de la toile, vérifiez la demande signée. Si vous ne l'obtenez pas, l'utilisateur n'a probablement pas accès à partir de Facebook. Pour vous assurer de confirmer la structure et le contenu des champs signed_request.
Avec le php-sdk, vous pouvez obtenir la demande signée comme ceci:
Vous pouvez en savoir plus sur la demande signée ici:
https://developers.facebook.com/docs/reference/php/facebook-getSignedRequest/
et ici:
https://developers.facebook.com/docs/reference/login/signed-request/
la source
Cela a fini par être la solution la plus simple pour moi.
la source
Mais seulement si le nombre d'iframes diffère dans votre page et la page qui vous charge dans iframe. Ne faites pas d'iframe dans votre page pour avoir une garantie à 100% du résultat de ce code
la source
Écrivez ce javascript dans chaque page
Ensuite, il sera automatiquement redirigé vers la page d'accueil.
la source