Recarregar um iframe com jQuery


151

Eu tenho dois iframes em uma página e um faz alterações na outra, mas o outro iframe não mostra a alteração até que eu atualize. Existe uma maneira fácil de atualizar esse iframe com o jQuery?

<div class="project">
  <iframe id="currentElement" class="myframe" name="myframe" src="http://somesite.com/something/new"></iframe>
</div>

3
O documento iframe está em um domínio diferente?
Pekka

Você tem acesso ao código do site que aparece no iFrame?
Matt Asbury

Mostrar mais código - o html para os dois iFrames e também o código javascript que você está usando para fazer as alterações. É difícil descobrir qual é o problema, vendo apenas o que você incluiu até agora.
Ben Lee

Eu tenho acesso às sim código e o iframe está em um domínio diferente
Matt Elhotiby

@ Matt, quadros não estão autorizados a fazer alterações no conteúdo de quadros em outros domínios. Para exemplos de como contornar essa restrição scripting cross-domain ver isto: softwareas.com/cross-domain-communication-with-iframes
Ben Lee

Respostas:


174

Se o iframe não estivesse em um domínio diferente, você poderia fazer algo assim:

document.getElementById(FrameID).contentDocument.location.reload(true);

Mas como o iframe está em um domínio diferente, você terá acesso negado à contentDocumentpropriedade do iframe pela política de mesma origem .

Mas você pode forçar hackishly o iframe entre domínios a recarregar se seu código estiver sendo executado na página pai do iframe, definindo seu atributo src para si mesmo. Como isso:

// hackishly force iframe to reload
var iframe = document.getElementById(FrameId);
iframe.src = iframe.src;

Se você está tentando recarregar o iframe de outro iframe, está sem sorte, isso não é possível.


19
Sua pergunta era como fazer isso com jQuery - não Javascript. Veja a publicação de Sime Vidas abaixo para obter a resposta correta do jQuery.
FastTrack 24/03

2
O script não funciona no meu IE9 (não verifique outra versão). Alterar contentDocument para contentWindow faz com que funcione no IE9. document.getElementById(FrameID).contentWindow.location.reload(true);
Han He

3
Isto não funcionou para mim, porém eu fiz algo parecido iframe.contentDocument.location=iframe.src; em vez que trabalhou grande
glitchyme

3
Este Jquery funcionou como um encanto para mim:$('#map_iframe').attr('src', $('#map_iframe').attr('src'));
Topher Hunt

234
$( '#iframe' ).attr( 'src', function ( i, val ) { return val; });

2
+1 para ter apenas uma referência ao ID, menos propensos a mudar, mas esquecer o outro
Matthew Bloqueio

1
@NicolaeSurdu Além disso, isto:(function (elem) { elem.src = elem.src; }($('#iframe')[0]));
Šime Vidas

1
Para recarregar um iframe de dentro da outra, mude para: $ ('# iframe', window.parent.document) .attr ('src', função (i, val) {return val;});
Tillito 24/05

No Internet Explorer, soluções javascript como document.getElementById(FrameID).contentWindow.location.reload(true);não estão funcionando corretamente. Essa resposta funciona melhor.
BeyazKaplan

55

você também pode usar o jquery. É o mesmo que Alex propôs usando o JQuery:

 $('#currentElement').attr("src", $('#currentElement').attr("src"));

3
A vantagem desta solução é a legibilidade. Embora não seja tão eficiente quanto a resposta da Vidas, é óbvio o que está acontecendo.
Robert Egginton

Eu concordo, eu também tendem a preferir a legibilidade desta solução
Yonatan Naor

var f = $('#iframeX') ; f.attr( 'src', f.attr( 'src' ))pode ser mais robusto para manter e ler
Andreas Dietrich

9

Recarregar um iframe com jQuery

faça um link dentro do iframe, digamos com id = "reload" e use o código a seguir

$('#reload').click(function() {
    document.location.reload();
});

e você está pronto para usar todos os navegadores.

Recarregue um iframe com HTML (sem necessidade de Java Script)

Possui uma solução mais simples: que funciona sem javaScript (FF, Webkit)

basta fazer uma âncora no lado do seu iframe

   <a href="#" target="_SELF">Refresh Comments</a>

Quando você clica nessa âncora, apenas atualiza seu iframe

Mas se você tiver um parâmetro enviado para o seu iframe, faça o seguinte.

  <a id="comnt-limit" href="?id=<?= $page_id?>" target="_SELF">Refresh Comments</a>

não precisa de nenhum URL de página porque -> target = "_ SELF" faz isso por você


9

com jquery você pode usar isto:

$('#iframeid',window.parent.document).attr('src',$('#iframeid',window.parent.document).attr('src'));

Esta solução se você deseja atualizar o iframe atual, onde estamos. Muito obrigado!
DaemonHK

5

Apenas retribuindo a resposta de Alex, mas com o jQuery

var currSrc = $("#currentElement").attr("src");
$("#currentElement").attr("src", currSrc);

4

Aqui está outra maneira

$( '#iframe' ).attr( 'src', function () { return $( this )[0].src; } );

1
$( '#iframe' ).attr('src', $( '#iframe' ).attr('src'));
Zanderwar 16/06/19

3

Tenho certeza de que todos os exemplos acima apenas recarregam o iframe com seu src original, não com o URL atual.

$('#frameId').attr('src', function () { return $(this).contents().get(0).location.href });

Isso deve ser recarregado usando o URL atual.


2

Se você for de domínio cruzado, simplesmente definir o src de volta para o mesmo URL nem sempre acionará uma recarga, mesmo que o hash do local seja alterado.

Deparei com esse problema ao criar manualmente iframes de botão do Twitter, que não eram atualizados quando eu atualizava os URLs.

Os botões do tipo Twitter têm a forma: .../tweet_button.html#&_version=2&count=none&etc=...

Como o Twitter usa o fragmento de documento para o URL, a alteração do hash / fragmento não recarregou a fonte e os destinos do botão não refletiram meu novo conteúdo carregado com ajax.

Você pode anexar um parâmetro de string de consulta para forçar o recarregamento (por exemplo: "?_=" + Math.random() mas isso desperdiçará largura de banda, especialmente neste exemplo em que a abordagem do Twitter estava especificamente tentando ativar o cache.

Para recarregar algo que muda apenas com tags de hash, é necessário remover o elemento ou alterá-lo src, aguarde a saída do encadeamento e atribua-o novamente. Se a página ainda estiver em cache, isso não exigirá uma ocorrência na rede, mas acionará o recarregamento de quadros.

 var old = iframe.src;
 iframe.src = '';
 setTimeout( function () {
    iframe.src = old;
 }, 0);

Atualização : o uso dessa abordagem cria itens de histórico indesejados. Em vez disso, remova e recrie o elemento iframe toda vez, o que mantém esse botão voltar () funcionando conforme o esperado. Também é bom não ter o cronômetro.


2

Apenas respondendo a resposta de Alex, mas com o jQuery:

var e = $('#myFrame');
    e.attr("src", e.attr("src"));

Ou você pode usar uma função pequena:

function iframeRefresh(e) {
    var c = $(e);
        c.attr("src", c.attr("src"));
}

Espero que ajude.



1

Isso é possível com JavaScript simples.

  • No iFrame1, crie uma função JavaScript que é chamada na tag body body onload. Eu tenho que verificar uma variável do lado do servidor que eu defino, para que não tente executar a função JavaScript no iframe2, a menos que eu tenha tomado uma ação específica no iframe1. Você pode configurá-lo como uma função acionada por pressionar um botão ou como desejar no iframe1.
  • Então, no iframe2, você tem a segunda função que listo abaixo. A função no iframe1 basicamente vai para a página pai e, em seguida, usa a window.framessintaxe para disparar uma função JavaScript no iframe2. Apenas certifique-se de usar o id/ namedo iframe2 e não o src.
//function in iframe1
function refreshIframe2()
{
    if (<cfoutput>#didValidation#</cfoutput> == 1)
    {   
         parent.window.frames.iframe2.refreshPage();
    }
}

//function in iframe2
function refreshPage()
{   
    document.location.reload();
}

1

// atualiza todos os iframes na página

var f_list = document.getElementsByTagName('iframe');

 for (var i = 0, f; f = f_list[i]; i++) {
                            f.src = f.src;
                        }

0
    ifrX =document.getElementById('id') //or 
    ifrX =frames['index'];

A solução entre navegadores é:

    ifrX.src = ifrX.contentWindow.location

isso é útil especialmente quando <iframe> é o destino de um <form>


por que jQuery ?! js simples quando disponível
bortunac

0

RESOLVIDO! Registro-me no stockoverflow apenas para compartilhar com você a única solução (pelo menos no ASP.NET/IE/FF/Chrome) que funciona! A idéia é substituir o valor innerHTML de uma div pelo seu atual valor innerHTML.

Aqui está o trecho HTML:

<div class="content-2" id="divGranite">
<h2>Granite Purchase</h2>
<IFRAME  runat="server" id="frameGranite" src="Jobs-granite.aspx" width="820px" height="300px" frameborder="0" seamless  ></IFRAME>
</div>

E meu código Javascript:

function refreshGranite() {           
   var iframe = document.getElementById('divGranite')
   iframe.innerHTML = iframe.innerHTML;
}

Espero que isto ajude.


Vários erros nesta resposta: 1. não é um componente do ASP.NET; portanto, não runat="server"é aplicável; 2. Por que todas as tampas IFRAME? 3. os valores dos atributos de dimensão não têm unidades; 4. frameborderfoi descontinuado
Raptor

0

Você precisa usar

[0] .src

para encontrar a origem do iframe e seu URL precisa estar no mesmo domínio do pai.

setInterval(refreshMe, 5000);
function refreshMe() {
    $("#currentElement")[0].src = $("#currentElement")[0].src;   
}

0

você pode fazer assim

$('.refrech-iframe').click(function(){
        $(".myiframe").attr("src", function(index, attr){ 
            return attr;
        });
    });

-5

A solução abaixo funcionará com certeza:

window.parent.location.href = window.parent.location.href;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.