Estou escrevendo um aplicativo de facebook baseado em iframe. Agora, quero usar a mesma página html para renderizar o site normal e a página de tela no facebook. Quero saber se posso determinar se a página foi carregada dentro do iframe ou diretamente no navegador?
javascript
facebook
iframe
akshat
fonte
fonte
Respostas:
Os navegadores podem bloquear o acesso
window.top
devido à mesma política de origem . Os erros do IE também ocorrem. Aqui está o código de trabalho:top
eself
são amboswindow
objetos (junto comparent
), para ver se sua janela é a janela superior.fonte
window.self !== window.top
retornamtrue
quando executados a partir do conteúdo deframe
, ouiframe
.Quando em um iframe na mesma origem que o pai, o
window.frameElement
método retorna o elemento (por exemplo,iframe
ouobject
) no qual a janela está incorporada. Caso contrário, se estiver navegando em um contexto de nível superior, ou se o quadro pai e o filho tiverem origens diferentes, será avaliado comonull
.Este é um padrão HTML com suporte básico em todos os navegadores modernos.
fonte
frameElement
lançará uma exceção SecurityError em iframes de origem cruzada, de acordo com o W3C (o WHATWG diz que deve retornar nulo). Portanto, você pode querer envolvê-lo em umatry...catch
declaração.null
dentro e foraiframe
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.
O RoBorg está correto, mas eu queria adicionar uma nota lateral.
No IE7 / IE8, quando a Microsoft adicionou Guias ao navegador, eles quebraram uma coisa que causaria estragos no seu JS se você não tomar cuidado.
Imagine este layout de página:
Agora, no quadro "baz", você clica em um link (sem destino, carrega no quadro "baz") que funciona bem.
Se a página carregada, vamos chamá-la special.html, usa JS para verificar se "it" possui um quadro pai chamado "bar" e retornará true (esperado).
Agora, digamos que a página special.html, quando carregada, verifica o quadro pai (quanto à existência e seu nome, e se for "bar", ele se recarrega no quadro de barras.
Por enquanto, tudo bem. Agora vem o bug.
Digamos que, em vez de clicar no link original como de costume, e carregando a página special.html no quadro "baz", você clicou no meio ou optou por abri-la em uma nova guia.
Quando essa nova guia for carregada ( sem quadros-pai! ), O IE entrará em um loop infinito de carregamento de página!porque o IE "copia" a estrutura do quadro em JavaScript, de modo que a nova guia tenha um pai e esse pai tenha o nome "barra".
A boa notícia é que verificando:
nessa nova guia retorna true e, portanto, você pode testar esta condição ímpar.
fonte
window.parent
.A resposta aceita não funcionou para mim dentro do script de conteúdo de uma extensão do Firefox 6.0 (Addon-SDK 1.0): o Firefox executa o script de conteúdo em cada um: na janela de nível superior e em todos os iframes.
Dentro do script de conteúdo, obtenho os seguintes resultados:
O estranho dessa saída é que é sempre a mesma, independentemente de o código ser executado dentro de um iframe ou na janela de nível superior.
Por outro lado, o Google Chrome parece executar meu script de conteúdo apenas uma vez na janela de nível superior, para que o procedimento acima não funcione.
O que finalmente funcionou para mim em um script de conteúdo nos dois navegadores é o seguinte:
Sem iframes, isso é impresso
0:0
, em uma janela de nível superior que contém um quadro impresso1:1
e no único iframe de um documento impresso0:1
.Isso permite que minha extensão determine nos dois navegadores se há iframes presentes e, adicionalmente, no Firefox se for executada dentro de um dos iframes.
fonte
document.defaultView.self === document.defaultView.top
ouwindow !== window.top
. No script de conteúdo do SDK de expansão do Firefox, oself
objeto global é um objeto usado para se comunicar com o script principal.Não tenho certeza de como este exemplo funciona para navegadores da Web mais antigos, mas eu o uso para o IE, Firefox e Chrome sem um problema:
fonte
!(window===window.parent)
Eu estou usando isso:
fonte
.indexOf("HTMLIFrameElement")
:?Use esta função javascript como um exemplo de como fazer isso.
fonte
Script de quebra de quadro do navegador herdado, o melhor por agora
As outras soluções não funcionaram para mim. Este funciona em todos os navegadores:
Uma maneira de se defender contra o clickjacking é incluir um script de "quebra de quadros" em cada página que não deve ser enquadrada. A metodologia a seguir impedirá que uma página da Web seja enquadrada mesmo em navegadores herdados, que não suportam o X-Frame-Options-Header.
No elemento HEAD do documento, adicione o seguinte:
Primeiro, aplique um ID ao próprio elemento de estilo:
Dessa forma, tudo pode estar no documento HEAD e você só precisa de um método / taglib na sua API.
Referência: https://www.codemagi.com/blog/post/194
fonte
fonte
Como você está perguntando no contexto de um aplicativo do facebook, considere detectar isso no servidor quando a solicitação inicial é feita. O Facebook transmitirá um monte de dados da string de consulta, incluindo a chave fb_sig_user, se for chamada de um iframe.
Como você provavelmente precisa verificar e usar esses dados de qualquer maneira no seu aplicativo, use-os para determinar o contexto apropriado a ser renderizado.
fonte
Na verdade, eu costumava verificar o window.parent e funcionou para mim, mas ultimamente o window é um objeto cíclico e sempre possui uma chave pai, iframe ou iframe.
Como os comentários sugerem, é difícil comparar com os trabalhos window.parent. Não tenho certeza se isso funcionará se o iframe for exatamente a mesma página da Web como pai.
fonte
window.parent === window
é verdadeiro. Portanto, sua resposta está incorreta. E essa comparação poderia ser usada para verificação (pelo menos no chrome, não foi testada em outros navegadores).É um antigo código que eu usei algumas vezes:
fonte
(parent.location == self.location)
parent.location
. Caso contrário, uma exceção é lançadaSe você deseja saber se o usuário está acessando seu aplicativo na guia da página do Facebook ou na tela, verifique a Solicitação assinada. Se você não conseguir, provavelmente o usuário não está acessando no facebook. Para certificar-se de confirmar a estrutura dos campos de assinatura_request e o conteúdo dos campos.
Com o php-sdk, você pode obter a solicitação assinada como esta:
Você pode ler mais sobre Solicitação assinada aqui:
https://developers.facebook.com/docs/reference/php/facebook-getSignedRequest/
e aqui:
https://developers.facebook.com/docs/reference/login/signed-request/
fonte
Isso acabou sendo a solução mais simples para mim.
fonte
Mas apenas se o número de iframes for diferente na sua página e na página que está carregando você no iframe. Não crie iframe na sua página para ter 100% de garantia do resultado desse código
fonte
Escreva esse javascript em cada página
Em seguida, ele será redirecionado automaticamente para a página inicial.
fonte