Recharger un iframe avec jQuery
J'ai deux iframes sur une page et l'un apporte des modifications à l'autre mais l'autre iframe n'affiche pas le changement jusqu'à ce que je l'actualise. Existe-t-il un moyen facile d'actualiser cet iframe avec jQuery?
<div class="project">
<iframe id="currentElement" class="myframe" name="myframe" src="http://somesite.com/something/new"></iframe>
</div>
17 réponses
Si l'iframe n'était pas sur un domaine différent, vous pouvez faire quelque chose comme ceci:
document.getElementById(FrameID).contentDocument.location.reload(true);
Mais puisque l'iframe est sur un domaine différent, vous serez refusé l'accès à la propriété contentDocument
de l'iframe par la stratégie même origine .
Mais vous pouvez forcer hackishly l'iframe cross-domain à recharger si votre code est en cours d'exécution sur la page parent de l'iframe, en définissant son attribut src à lui-même. Comme ceci:
// hackishly force iframe to reload
var iframe = document.getElementById(FrameId);
iframe.src = iframe.src;
Si vous essayez de recharger l'iframe d'un autre iframe, vous êtes hors de la chance, que est pas possible.
$( '#iframe' ).attr( 'src', function ( i, val ) { return val; });
Vous pouvez également utiliser jquery. C'est la même chose que Alex a proposé juste en utilisant JQuery:
$('#currentElement').attr("src", $('#currentElement').attr("src"));
Recharger une iframe avec jQuery
Faire un lien dans l'iframe disons avec id = "reload" puis utiliser le code suivant
$('#reload').click(function() {
document.location.reload();
});
Et vous êtes bon pour aller avec tous les navigateurs.
Recharger un iframe avec HTML (Pas de script Java req.)
Il a une solution plus simple: qui fonctionne sans javaScript dans (FF, Webkit)
Il suffit de faire une ancre dans votre iframe
<a href="#" target="_SELF">Refresh Comments</a>
Lorsque vous cliquez sur cette ancre, il suffit de rafraîchir votre iframe
Mais si vous avez le paramètre send à votre iframe, faites-le comme suit.
<a id="comnt-limit" href="?id=<?= $page_id?>" target="_SELF">Refresh Comments</a>
N'ont pas besoin d'url de page parce que - > target= "_SELF" le faire pour vous
Avec jquery, vous pouvez utiliser ceci:
$('#iframeid',window.parent.document).attr('src',$('#iframeid',window.parent.document).attr('src'));
Juste réciproque de la réponse D'Alex mais avec jQuery
var currSrc = $("#currentElement").attr("src");
$("#currentElement").attr("src", currSrc);
Je suis sûr que tous les exemples ci-dessus ne rechargent que l'iframe avec son src d'origine, pas son URL actuelle.
$('#frameId').attr('src', function () { return $(this).contents().get(0).location.href });
Qui devrait se recharger en utilisant l'url actuelle.
Voici une autre façon
$( '#iframe' ).attr( 'src', function () { return $( this )[0].src; } );
Si vous êtes cross-domain, le simple fait de rétablir le src sur la même url ne déclenchera pas toujours un rechargement, même si le hachage de l'emplacement change.
A rencontré ce problème lors de la construction manuelle des iframes du bouton Twitter, qui ne s'actualiserait pas lorsque j'ai mis à jour les URL.
Twitter comme boutons ont la forme:
.../tweet_button.html#&_version=2&count=none&etc=...
Puisque Twitter utilise le fragment de document pour l'url, la modification du hachage / fragment n'a pas rechargé la source, et les cibles de bouton ne reflétaient pas mon nouveau ajax le contenu chargé.
Vous pouvez ajouter un paramètre de chaîne de requête pour forcer le rechargement (par exemple: "?_=" + Math.random()
mais cela gaspillera de la bande passante, en particulier dans cet exemple où L'approche de Twitter essayait spécifiquement d'activer la mise en cache.
Pour recharger quelque chose qui ne change qu'avec des balises de hachage, vous devez supprimer l'élément, ou changer le src
, Attendre la sortie du thread, puis le réattribuer. Si la page est toujours mise en cache, cela ne devrait pas nécessiter un hit réseau, mais déclenche le cadre recharger.
var old = iframe.src;
iframe.src = '';
setTimeout( function () {
iframe.src = old;
}, 0);
Update : L'utilisation de cette approche crée des éléments d'historique indésirables. Au lieu de cela, supprimez et recréez l'élément iframe à chaque fois, ce qui maintient ce bouton back() comme prévu. Aussi agréable de ne pas avoir la minuterie.
Juste réciproque de la réponse D'Alex mais avec jQuery:
var e = $('#myFrame');
e.attr("src", e.attr("src"));
Ou vous pouvez utiliser la petite fonction:
function iframeRefresh(e) {
var c = $(e);
c.attr("src", c.attr("src"));
}
J'espère que ça aide.
$('IFRAME#currentElement').get(0).contentDocument.location.reload()
C'est possible avec du JavaScript simple.
- dans iFrame1, créez une fonction JavaScript appelée dans la balise body onload. Je l'ai vérifié une variable Côté Serveur que j'ai définie, donc il n'essaie pas d'exécuter la fonction JavaScript dans iframe2 sauf si j'ai pris une action spécifique dans iframe1. Vous pouvez configurer cela comme une fonction déclenchée par une pression sur le bouton ou comme vous le souhaitez dans iframe1.
- Ensuite, dans iframe2, vous avez la deuxième fonction que je liste ci-dessous. La fonction dans iframe1 fondamentalement, va à la page parent, puis utilise la syntaxe
window.frames
pour déclencher une fonction JavaScript dans iframe2. Juste assurez-vous d'utiliser leid
/name
de iframe2 et pas lasrc
.
//function in iframe1
function refreshIframe2()
{
if (<cfoutput>#didValidation#</cfoutput> == 1)
{
parent.window.frames.iframe2.refreshPage();
}
}
//function in iframe2
function refreshPage()
{
document.location.reload();
}
ifrX =document.getElementById('id') //or
ifrX =frames['index'];
La solution multi-navigateur est:
ifrX.src = ifrX.contentWindow.location
Ceci est utile surtout quand
Résolu! Je m'inscris à stockoverflow juste pour vous partager la seule solution (au moins dans ASP.NET/IE/FF/Chrome) ça marche! L'idée est de remplacer la valeur innerHTML d'un div par sa valeur innerHTML actuelle.
Voici L'extrait 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>
Et mon code Javascript:
function refreshGranite() {
var iframe = document.getElementById('divGranite')
iframe.innerHTML = iframe.innerHTML;
}
J'espère que cela aide.
, Vous devez utiliser
[0].src
Pour trouver la source de l'iframe et son URL doit être sur le même domaine du parent.
setInterval(refreshMe, 5000);
function refreshMe() {
$("#currentElement")[0].src = $("#currentElement")[0].src;
}
/ / actualise toutes les iframes sur la page
var f_list = document.getElementsByTagName('iframe');
for (var i = 0, f; f = f_list[i]; i++) {
f.src = f.src;
}
Ci-dessous solution fonctionnera à coup sûr:
window.parent.location.href = window.parent.location.href;