Muat ulang iframe dengan jQuery

151

Saya memiliki dua iframe pada halaman dan satu membuat perubahan ke yang lain tetapi iframe lainnya tidak menunjukkan perubahan sampai saya menyegarkan. Apakah ada cara mudah untuk menyegarkan iframe ini dengan jQuery?

<div class="project">
  <iframe id="currentElement" class="myframe" name="myframe" src="http://somesite.com/something/new"></iframe>
</div>
Matt Elhotiby
sumber
3
Apakah dokumen iframe di domain yang berbeda?
Pekka
Apakah Anda memiliki akses ke kode situs yang muncul di iFrame?
Matt Asbury
Tampilkan lebih banyak kode - html untuk kedua iFrames, dan juga kode javascript yang Anda gunakan untuk melakukan perubahan. Sulit untuk mengetahui apa masalahnya hanya melihat apa yang telah Anda sertakan sejauh ini.
Ben Lee
Saya memiliki akses ke kode ya dan iframe ada di domain yang berbeda
Matt Elhotiby
@ Mat, bingkai tidak diizinkan untuk melakukan perubahan pada isi bingkai di domain lain. Untuk contoh cara mengatasi pembatasan skrip lintas domain ini, lihat ini: softwareas.com/cross-domain-communication-with-iframes
Ben Lee

Jawaban:

174

Jika iframe tidak berada di domain yang berbeda, Anda dapat melakukan sesuatu seperti ini:

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

Tetapi karena iframe berada di domain yang berbeda, Anda akan ditolak akses ke contentDocumentproperti iframe dengan kebijakan yang sama-asal .

Tapi Anda bisa memaksa iframe lintas domain untuk memuat ulang jika kode Anda berjalan di halaman induk iframe, dengan mengatur atribut src untuk dirinya sendiri. Seperti ini:

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

Jika Anda mencoba untuk reload iframe dari iframe lain, Anda beruntung, yang adalah tidak mungkin.

Alex
sumber
19
Pertanyaannya adalah bagaimana menyelesaikan ini dengan jQuery - bukan Javascript. Lihat posting Sime Vidas 'di bawah ini untuk jawaban jQuery yang benar.
FastTrack
2
Skrip tidak berfungsi di IE9 saya (tidak memeriksa versi lain). Ubah contentDocument menjadi contentWindow membuatnya berfungsi pada IE9. document.getElementById(FrameID).contentWindow.location.reload(true);
Han He
3
Ini tidak berhasil untuk saya, namun saya iframe.contentDocument.location=iframe.src; malah melakukan sesuatu yang bekerja dengan baik
glitchyme
3
Jquery ini bekerja seperti pesona bagi saya:$('#map_iframe').attr('src', $('#map_iframe').attr('src'));
Perburuan Topher
234
$( '#iframe' ).attr( 'src', function ( i, val ) { return val; });
Šime Vidas
sumber
2
+1 karena hanya memiliki satu referensi ke ID, kecil kemungkinannya untuk mengubah satu tapi lupakan yang lain
Matthew Lock
1
@NicolaeSurdu Juga, ini:(function (elem) { elem.src = elem.src; }($('#iframe')[0]));
Šime Vidas
1
Untuk memuat ulang satu iframe dari yang lain, ubah menjadi: $ ('# iframe', window.parent.document) .attr ('src', function (i, val) {return val;});
Tillito
Pada Internet Explorer solusi javascript seperti document.getElementById(FrameID).contentWindow.location.reload(true);tidak berfungsi dengan benar. Jawaban ini berfungsi lebih baik.
BeyazKaplan
55

Anda juga bisa menggunakan jquery. Ini sama dengan yang diusulkan Alex hanya menggunakan JQuery:

 $('#currentElement').attr("src", $('#currentElement').attr("src"));
ynh
sumber
3
Keuntungan dari solusi ini adalah keterbacaan. Meskipun tidak seefisien jawaban Vidas, sudah jelas apa yang terjadi.
Robert Egginton
Saya setuju, saya juga cenderung lebih suka keterbacaan solusi ini
Yonatan Naor
var f = $('#iframeX') ; f.attr( 'src', f.attr( 'src' ))mungkin lebih kuat untuk mempertahankan dan membaca
Andreas Dietrich
9

Muat ulang iframe dengan jQuery

buat tautan di dalam iframe katakanlah dengan id = "reload" lalu gunakan kode berikut

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

dan Anda baik untuk menggunakan semua browser.

Muat ulang iframe dengan HTML (tanpa Java Script req.)

Ini memiliki solusi yang lebih sederhana: yang berfungsi tanpa javaScript di (FF, Webkit)

buat saja jangkar di sisi iframe Anda

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

Ketika Anda mengklik jangkar ini, segarkan saja iframe Anda

Tetapi jika Anda memiliki parameter kirim ke iframe Anda maka lakukan sebagai berikut.

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

tidak memerlukan url halaman apa pun karena -> target = "_ SELF" lakukan untuk Anda


sumber
9

dengan jquery Anda dapat menggunakan ini:

$('#iframeid',window.parent.document).attr('src',$('#iframeid',window.parent.document).attr('src'));
selain itu
sumber
Solusi ini jika Anda ingin menyegarkan iframe saat ini, di mana kami berada. Terima kasih banyak!
DaemonHK
5

Hanya membalas jawaban Alex tetapi dengan jQuery

var currSrc = $("#currentElement").attr("src");
$("#currentElement").attr("src", currSrc);
Matt Asbury
sumber
4

Ini cara lain

$( '#iframe' ).attr( 'src', function () { return $( this )[0].src; } );
Nasir Mahmood
sumber
1
$( '#iframe' ).attr('src', $( '#iframe' ).attr('src'));
zanderwar
3

Saya cukup yakin semua contoh di atas hanya memuat ulang iframe dengan src aslinya, bukan URL saat ini.

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

Itu harus dimuat ulang menggunakan url saat ini.

Menandai
sumber
2

Jika Anda lintas domain, cukup mengatur src kembali ke url yang sama tidak akan selalu memicu memuat ulang, bahkan jika hash lokasi berubah.

Mengalami masalah ini saat membuat iframe tombol Twitter secara manual, yang tidak akan menyegarkan ketika saya memperbarui url.

Tombol suka Twitter memiliki bentuk: .../tweet_button.html#&_version=2&count=none&etc=...

Karena Twitter menggunakan fragmen dokumen untuk url, mengubah hash / fragmen tidak memuat ulang sumber, dan target tombol tidak mencerminkan konten baru saya yang dimuat ajax.

Anda dapat menambahkan parameter string kueri untuk memaksa memuat ulang (misalnya: "?_=" + Math.random() tetapi itu akan membuang-buang bandwidth, terutama dalam contoh ini di mana pendekatan Twitter secara khusus mencoba mengaktifkan caching.

Untuk memuat ulang sesuatu yang hanya berubah dengan tag hash, Anda perlu menghapus elemen, atau mengubah src, menunggu utas keluar, lalu tetapkan kembali. Jika halaman masih di-cache, ini seharusnya tidak memerlukan hit jaringan, tetapi memicu frame memuat ulang.

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

Pembaruan : Menggunakan pendekatan ini membuat item riwayat yang tidak diinginkan. Alih-alih, hapus dan buat ulang elemen iframe setiap kali, yang membuat tombol ini kembali () berfungsi seperti yang diharapkan. Senang juga tidak memiliki timer.

greg.kindel
sumber
2

Hanya membalas jawaban Alex tetapi dengan jQuery:

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

Atau Anda dapat menggunakan fungsi kecil:

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

Saya harap ini membantu.

Akm16
sumber
2
$('IFRAME#currentElement').get(0).contentDocument.location.reload()
Pavel
sumber
tidak bekerja di waterfox 2019.10
Andreas Dietrich
1

Ini dimungkinkan dengan JavaScript sederhana.

  • Di iFrame1, buat fungsi JavaScript yang disebut di tag body onload. Saya telah memeriksa variabel sisi server yang saya atur, jadi itu tidak mencoba untuk menjalankan fungsi JavaScript di iframe2 kecuali saya telah mengambil tindakan spesifik di iframe1. Anda dapat mengatur ini sebagai fungsi yang dipicu oleh tombol tekan atau bagaimanapun Anda ingin di iframe1.
  • Kemudian di iframe2, Anda memiliki fungsi kedua yang saya sebutkan di bawah ini. Fungsi di iframe1 pada dasarnya pergi ke halaman induk dan kemudian menggunakan window.framessintaks untuk memecat fungsi JavaScript di iframe2. Pastikan untuk menggunakan id/ namedari iframe2 dan bukan src.
//function in iframe1
function refreshIframe2()
{
    if (<cfoutput>#didValidation#</cfoutput> == 1)
    {   
         parent.window.frames.iframe2.refreshPage();
    }
}

//function in iframe2
function refreshPage()
{   
    document.location.reload();
}
Keith Pastorek
sumber
1

// menyegarkan semua iframe di halaman

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

 for (var i = 0, f; f = f_list[i]; i++) {
                            f.src = f.src;
                        }
wesley7
sumber
0
    ifrX =document.getElementById('id') //or 
    ifrX =frames['index'];

solusi lintas-browser adalah:

    ifrX.src = ifrX.contentWindow.location

ini berguna terutama ketika <iframe> adalah target dari suatu <form>

bortunac
sumber
mengapa jQuery ?! ketika js sederhana tersedia
bortunac
0

TERPECAHKAN! Saya mendaftar ke stockoverflow hanya untuk membagikan kepada Anda satu-satunya solusi (setidaknya di ASP.NET/IE/FF/Chrome) yang berfungsi! Idenya adalah untuk mengganti nilai innerHTML dari div dengan nilai innerHTML saat ini.

Berikut ini cuplikan 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>

Dan kode Javascript saya:

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

Semoga ini membantu.

Hubert17
sumber
Beberapa kesalahan dalam jawaban ini: 1. bukan komponen ASP.NET, oleh karena runat="server"itu tidak berlaku; 2. Mengapa semua topi untuk IFRAME? 3. nilai atribut dimensi tidak memiliki unit; 4. framebordersudah tidak digunakan lagi
Raptor
0

Anda harus menggunakan

[0] .src

untuk menemukan sumber iframe dan URL-nya harus berada pada domain induk yang sama.

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

Anda bisa melakukannya seperti ini

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

Solusi di bawah ini pasti bekerja:

window.parent.location.href = window.parent.location.href;
Mamta
sumber