Basicamente, eu tenho um iframe
incorporado em uma página e iframe
tem algumas rotinas de JavaScript que eu preciso chamar a partir da página pai.
Agora, o oposto é bastante simples, como você só precisa ligar parent.functionName()
, mas, infelizmente, eu preciso exatamente o oposto disso.
Observe que meu problema não é alterar o URL de origem do iframe
, mas invocar uma função definida no iframe
.
javascript
html
iframe
Tamas Czinege
fonte
fonte
Respostas:
Suponha que o ID do seu iFrame seja "targetFrame" e a função que você deseja chamar é
targetFunction()
:Você também pode acessar o quadro usando em
window.frames
vez dedocument.getElementById
.fonte
document.getElementById('remote_iframe_0').contentWindow.my.create_element_gadget('verify_user');"
remote_iframe_0 é criado programmaticaly por um apache baile servidor, maswindow.parent.document.getElementById('remote_iframe_0').contentWindow.my.create_element_gadget('verify_user');"
obrasExistem algumas peculiaridades a serem observadas aqui.
HTMLIFrameElement.contentWindow
é provavelmente a maneira mais fácil, mas não é uma propriedade padrão e alguns navegadores não a suportam, principalmente os mais antigos. Isso ocorre porque o padrão HTML do nível 1 do DOM não tem nada a dizer sobre owindow
objeto.Você também pode tentar
HTMLIFrameElement.contentDocument.defaultView
, que alguns navegadores mais antigos permitem, mas o IE não. Mesmo assim, o padrão não diz explicitamente que você recupera owindow
objeto, pelo mesmo motivo que (1), mas você pode escolher algumas versões extras do navegador aqui, se quiser.window.frames['name']
retornar a janela é a interface mais antiga e, portanto, mais confiável. Mas você precisa usar umname="..."
atributo para obter um quadro pelo nome, que é um pouco feio /descontinuado/ de transição. (id="..."
seria melhor, mas o IE não gosta disso.)window.frames[number]
também é muito confiável, mas saber o índice certo é o truque. Você pode se safar disso, por exemplo. se você sabe que possui apenas um iframe na página.É perfeitamente possível que o iframe filho ainda não tenha sido carregado ou que algo deu errado para torná-lo inacessível. Você pode achar mais fácil reverter o fluxo de comunicações: ou seja, faça com que o iframe filho notifique seu
window.parent
script quando terminar de carregar e estiver pronto para ser chamado de volta. Ao passar um de seus próprios objetos (por exemplo, uma função de retorno de chamada) para o script pai, esse pai pode se comunicar diretamente com o script no iframe sem ter que se preocupar com o que HTMLIFrameElement está associado.fonte
methode()
parte.iframe
É possível chamar uma função JS pai de , mas somente quando o pai e a página carregada noiframe
são do mesmo domínio, por exemplo, abc.com, e ambos estão usando o mesmo protocolo, ou seja, ambos estão emhttp://
ouhttps://
.A chamada falhará nos casos mencionados abaixo:
Qualquer solução alternativa para essa restrição seria extremamente insegura.
Por exemplo, imagine que eu registrei o domínio superwinningcontest.com e enviei links para os e-mails das pessoas. Quando eles carregavam a página principal, eu podia ocultar alguns
iframe
segundos e ler o feed do Facebook, verificar transações recentes da Amazon ou do PayPal ou - se eles usassem um serviço que não implementasse segurança suficiente - transferir dinheiro da conta contas. É por isso que o JavaScript é limitado ao mesmo domínio e ao mesmo protocolo.fonte
No IFRAME, torne sua função pública no objeto de janela:
Para acessar a partir da página pai, use este:
fonte
onclick()
evento simplesmente chamawindow.print()
. Isso imprime o conteúdo doiframe
perfeitamente. Mas quando a função pública da página do iframe chamawindow.print()
e se a página pai chama a função pública, o conteúdo do pai é impresso. Como devo codificar isso para que a chamada parawindow.print()
a função pública se comporte como noonclick
evento?onclick
. Você quer ligariframe.contentWindow.print()
.document.getElementById('myFrame').contentWindow.print();' and the pubic function
printContent () `(não o manipulador de eventos oncick) que chamawindow.print()
era chamado desta maneira:document.getElementById('myFrame').contentWindow.printContent();
Se o destino do iFrame e o documento contido estiverem em um domínio diferente, os métodos publicados anteriormente podem não funcionar, mas existe uma solução:
Por exemplo, se o documento A contiver um elemento iframe que contém o documento B e o script no documento A chamar postMessage () no objeto Window do documento B, um evento de mensagem será disparado nesse objeto, marcado como originário da Janela de documento A. O script no documento A pode se parecer com:
Para registrar um manipulador de eventos para eventos recebidos, o script usaria addEventListener () (ou mecanismos semelhantes). Por exemplo, o script no documento B pode se parecer com:
Esse script verifica primeiro o domínio esperado e, em seguida, analisa a mensagem, que é exibida para o usuário ou responde enviando uma mensagem de volta ao documento que a enviou em primeiro lugar.
via http://dev.w3.org/html5/postmsg/#web-messaging
fonte
Só para constar, encontrei o mesmo problema hoje, mas desta vez a página foi incorporada a um objeto, não a um iframe (já que era um documento XHTML 1.1). Veja como ele funciona com objetos:
(desculpe pelas quebras de linha feias, não cabiam em uma única linha)
fonte
O IFRAME deve estar na
frames[]
coleção. Use algo comofonte
method
uma propriedade dowindow
objeto do iframe .Quirksmode tinha um post sobre isso .
Como a página agora está quebrada e acessível apenas via archive.org, eu a reproduzi aqui:
IFrames
Nesta página, dou uma breve visão geral do acesso a iframes na página em que estão. Não é de surpreender que haja algumas considerações sobre o navegador.
Um iframe é um quadro embutido, um quadro que, embora contenha uma página completamente separada com sua própria URL, é colocado dentro de outra página HTML. Isso oferece possibilidades muito agradáveis em web design. O problema é acessar o iframe, por exemplo, para carregar uma nova página nele. Esta página explica como fazê-lo.
Moldura ou objeto?
A questão fundamental é se o iframe é visto como um quadro ou como um objeto.
top.frames[1].frames[2]
e tal). O iframe se encaixa nessa hierarquia de quadros?document.getElementById('theiframe'))
acessá-la. Em geral, os navegadores permitem ambas as visualizações em iframes 'reais' (codificados)), mas os iframes gerados não podem ser acessados como quadros.Atributo NAME
A regra mais importante é fornecer qualquer iframe que você criar um
name
atributo, mesmo se você também usar umid
.A maioria dos navegadores precisa do
name
atributo para tornar o iframe parte da hierarquia de quadros. Alguns navegadores (principalmente o Mozilla) precisamid
tornar o iframe acessível como um objeto. Ao atribuir os dois atributos ao iframe, você mantém suas opções em aberto. Masname
é muito mais importante queid
.Acesso
Você acessa o iframe como um objeto e altera o seu
src
ou acessa o iframe como um quadro e altera o seulocation.href
.document.getElementById ('iframe_id'). src = 'newpage.html'; frames ['iframe_name']. location.href = 'newpage.html'; A sintaxe do quadro é um pouco preferível porque o Opera 6 suporta, mas não a sintaxe do objeto.
Acessando o iframe
Portanto, para uma experiência completa em vários navegadores, você deve dar um nome ao iframe e usar o
sintaxe. Tanto quanto sei, isso sempre funciona.
Acessando o documento
O acesso ao documento dentro do iframe é bastante simples, desde que você use o
name
atributo Para contar o número de links no documento no iframe, façaframes['testiframe'].document.links.length
.Iframes gerados
Porém, quando você gera um iframe por meio do DOM do W3C, o iframe não é inserido imediatamente na
frames
matriz e aframes['testiframe'].location.href
sintaxe não funciona imediatamente. O navegador precisa de um tempo para que o iframe apareça na matriz, tempo durante o qual nenhum script pode ser executado.A
document.getElementById('testiframe').src
sintaxe funciona bem em todas as circunstâncias.O
target
atributo de um link também não funciona com iframes gerados, exceto no Opera, mesmo que eu tenha dado ao iframe gerado aname
e anid
.A falta de
target
suporte significa que você deve usar o JavaScript para alterar o conteúdo de um iframe gerado, mas como você precisa do JavaScript para gerá-lo em primeiro lugar, não vejo isso como um problema.Tamanho do texto em iframes
Um curioso bug do Explorer 6:
Quando você altera o tamanho do texto no menu Exibir, os tamanhos de texto em iframes são alterados corretamente. No entanto, este navegador não altera as quebras de linha no texto original, para que parte do texto fique invisível ou quebras de linha possam ocorrer enquanto a linha ainda pode conter outra palavra.
fonte
Encontrei uma solução bastante elegante.
Como você disse, é bastante fácil executar o código localizado no documento pai. E essa é a base do meu código, faça exatamente o oposto.
Quando meu iframe é carregado, chamo uma função localizada no documento pai, passando como argumento uma referência a uma função local, localizada no documento do iframe. O documento pai agora tem acesso direto à função do iframe por meio dessa referência.
Exemplo:
No pai:
No iframe:
Quando o iframe for carregado, ele chamará parent.tunnel (YourFunctionReference), que executará a função recebida no parâmetro
Simples assim, sem ter que lidar com todos os métodos fora dos padrões dos vários navegadores.
fonte
Algumas dessas respostas não abordam a questão do CORS ou não tornam óbvio onde você coloca os trechos de código para tornar a comunicação possível.
Aqui está um exemplo concreto. Digamos que eu queira clicar em um botão na página pai e fazer isso dentro do iframe. Aqui está como eu faria isso.
parent_frame.html
iframe_page.html
Para ir na outra direção (clique no botão dentro do iframe para chamar o método fora do iframe), basta alternar para o local do snippet de código e alterar isso:
para isso:
fonte
Continuando com a resposta de JoelAnair :
Para maior robustez, use o seguinte:
Trabalho como charme :)
fonte
Seguindo a resposta de Nitin Bansal
e para ainda mais robustez:
e
fonte
fonte
Mesmas coisas, mas um pouco mais fácil, será Como atualizar a página pai da página no iframe . Basta chamar a função da página pai para chamar a função javascript para recarregar a página:
Ou faça isso diretamente da página no iframe:
Ambos os trabalhos.
fonte
Tente apenas
parent.myfunction()
fonte
Se você deseja chamar a função JavaScript no pai a partir do iframe gerado por outra função, ex shadowbox ou lightbox.
Você deve tentar fazer uso do
window
objeto e chamar a função pai:fonte
Use o seguinte para chamar a função de um quadro na página pai
fonte