Recargue un iframe con jQuery


151

Tengo dos iframes en una página y uno realiza cambios en el otro, pero el otro iframe no muestra el cambio hasta que me actualizo. ¿Hay una manera fácil de actualizar este iframe con jQuery?

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

3
¿El documento del iframe está en un dominio diferente?
Pekka

¿Tiene acceso al código del sitio que aparece en el iFrame?
Matt Asbury el

Mostrar más código: el html para ambos iFrames y también el código javascript que está utilizando para realizar los cambios. Es difícil descubrir cuál es el problema viendo solo lo que has incluido hasta ahora.
Ben Lee

Tengo acceso al código sí y el iframe está en un dominio diferente
Matt Elhotiby

@Matt, los marcos no pueden realizar cambios en el contenido de los marcos en otros dominios. Para ver ejemplos de cómo evitar esta restricción de secuencias de comandos entre dominios, consulte esto: softwareas.com/cross-domain-communication-with-iframes
Ben Lee

Respuestas:


174

Si el iframe no estaba en un dominio diferente, podría hacer algo como esto:

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

Pero dado que el iframe está en un dominio diferente, se le negará el acceso al iframe contentDocument política del mismo origen propiedad .

Pero puede forzar hackear el iframe entre dominios para que se vuelva a cargar si su código se está ejecutando en la página principal del iframe, estableciendo su atributo src en sí mismo. Me gusta esto:

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

Si está intentando recargar el iframe desde otro iframe, no tiene suerte, eso no es posible.


19
Su pregunta era cómo lograr esto con jQuery, no con Javascript. Vea la publicación de Sime Vidas a continuación para obtener la respuesta correcta de jQuery.
FastTrack

2
El script no funciona en mi IE9 (no verifique otra versión). Cambiar contentDocument a contentWindow hace que funcione en IE9. document.getElementById(FrameID).contentWindow.location.reload(true);
Han He

3
Esto no funcionó para mí, sin embargo, hice algo como lo iframe.contentDocument.location=iframe.src; que funcionó muy bien
glitchyme

3
Este Jquery funcionó a las mil maravillas para mí:$('#map_iframe').attr('src', $('#map_iframe').attr('src'));
Topher Hunt

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

2
+1 por tener solo una referencia a la ID, es menos probable que cambie una pero olvide la otra
Matthew Lock

1
@NicolaeSurdu Además, esto:(function (elem) { elem.src = elem.src; }($('#iframe')[0]));
Šime Vidas

1
Para recargar un iframe desde el otro, cambie a: $ ('# iframe', window.parent.document) .attr ('src', function (i, val) {return val;});
Tillito

En Internet Explorer, las soluciones javascript document.getElementById(FrameID).contentWindow.location.reload(true);no funcionan correctamente. Esta respuesta funciona mejor.
BeyazKaplan

55

También puedes usar jquery. Esto es lo mismo que Alex propuso simplemente usando JQuery:

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

3
La ventaja de esta solución es la legibilidad. Si bien no es tan eficiente como la respuesta de Vidas, es obvio lo que está sucediendo.
Robert Egginton

Estoy de acuerdo, también tiendo a preferir la legibilidad de esta solución
Yonatan Naor

var f = $('#iframeX') ; f.attr( 'src', f.attr( 'src' ))puede ser más robusto para mantener y leer
Andreas Dietrich

9

Recargue un iframe con jQuery

haga un enlace dentro del iframe, digamos con id = "reload" y luego use el siguiente código

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

y eres bueno para ir con todos los navegadores.

Recargue un iframe con HTML (no se requiere Java Script)

Tiene una solución más simple: que funciona sin javaScript en (FF, Webkit)

solo haga un ancla dentro de su iframe

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

Cuando haces clic en este ancla, simplemente actualiza tu iframe

Pero si tiene envío de parámetros a su iframe, hágalo de la siguiente manera.

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

no necesita ninguna URL de la página porque -> target = "_ SELF" lo hace por usted


9

con jquery puedes usar esto:

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

Esta solución si desea actualizar el iframe actual, donde estamos. ¡Muchas gracias!
DaemonHK

5

Recíprocamente la respuesta de Alex pero con jQuery

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

4

Aquí hay otra manera

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

1
$( '#iframe' ).attr('src', $( '#iframe' ).attr('src'));
zanderwar

3

Estoy bastante seguro de que todos los ejemplos anteriores solo vuelven a cargar el iframe con su src original, no con su URL actual.

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

Eso debería recargar usando la url actual.


2

Si tiene un dominio cruzado, simplemente establecer el src nuevamente en la misma URL no siempre activará una recarga, incluso si cambia el hash de ubicación.

Encontré este problema al construir manualmente iframes de botones de Twitter, que no se actualizarían cuando actualizara las URL.

Los botones Me gusta de Twitter tienen la forma: .../tweet_button.html#&_version=2&count=none&etc=...

Como Twitter usa el fragmento de documento para la url, cambiar el hash / fragmento no volvió a cargar la fuente, y los objetivos de los botones no reflejaron mi nuevo contenido cargado de ajax.

Puede agregar un parámetro de cadena de consulta para forzar la recarga (por ejemplo: "?_=" + Math.random() pero eso desperdiciará el ancho de banda, especialmente en este ejemplo donde el enfoque de Twitter estaba tratando específicamente de habilitar el almacenamiento en caché.

Para volver a cargar algo que solo cambia con etiquetas hash, debe eliminar el elemento o cambiarlo src, esperar a que salga el hilo y luego asignarlo de nuevo. Si la página todavía está en caché, esto no debería requerir una visita a la red, pero sí activa la recarga del marco.

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

Actualización : el uso de este enfoque crea elementos de historial no deseados. En su lugar, elimine y vuelva a crear el elemento iframe cada vez, lo que mantiene este botón de retroceso () funcionando como se esperaba. También es bueno no tener el temporizador.


2

Solo correspondiendo la respuesta de Alex pero con jQuery:

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

O puede usar una función pequeña:

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

Espero que ayude.



1

Esto es posible con JavaScript simple.

  • En iFrame1, realice una función de JavaScript que se llama en la etiqueta de carga del cuerpo. Tengo que verifique una variable del lado del servidor que configuré, por lo que no intenta ejecutar la función de JavaScript en iframe2 a menos que haya tomado una acción específica en iframe1. Puede configurar esto como una función activada presionando un botón o como desee en iframe1.
  • Luego, en iframe2, tiene la segunda función que enumero a continuación. La función en iframe1 básicamente va a la página principal y luego usa la window.framessintaxis para activar una función de JavaScript en iframe2. Solo asegúrese de usar el id/ namede iframe2 y no el 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

// actualiza todos los iframes en la 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'];

La solución de navegador cruzado es:

    ifrX.src = ifrX.contentWindow.location

Esto es útil especialmente cuando <iframe> es el objetivo de un <form>


¿Por qué jQuery? cuando simple js disponible
bortunac

0

¡RESUELTO! ¡Me registro en stockoverflow solo para compartir con ustedes la única solución (al menos en ASP.NET/IE/FF/Chrome) que funciona! La idea es reemplazar el valor innerHTML de un div por su valor innerHTML actual.

Aquí está el fragmento de 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>

Y mi código Javascript:

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

Espero que esto ayude.


Múltiples errores en esta respuesta: 1. no es un componente ASP.NET, por runat="server"lo tanto, no es aplicable; 2. ¿Por qué todas las gorras IFRAME? 3. los valores de atributo de dimensión no tienen unidades; 4. frameborderestá en desuso
Raptor

0

Necesitas usar

[0] .src

para encontrar la fuente del iframe y su URL debe estar en el mismo dominio del padre.

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

0

puedes hacerlo asi

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

-5

La siguiente solución funcionará con seguridad:

window.parent.location.href = window.parent.location.href;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.