JQuery ile iframe'i yeniden yükleme


151

Bir sayfada iki iframe'im var ve biri diğerinde değişiklik yapıyor ancak diğer iframe yenilemene kadar değişikliği göstermiyor. Bu iframe'i jQuery ile yenilemenin kolay bir yolu var mı?

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

3
İframe belgesi farklı bir alan adında mı?
Pekka

İFrame'de görünen sitenin koduna erişiminiz var mı?
Matt Asbury

Daha fazla kod göster - hem iFrames için html, hem de değişiklikleri yapmak için kullandığınız javascript kodu. Sadece şimdiye kadar neleri eklediğinizi görmekte sorunun ne olduğunu anlamak zor.
Ben Lee

Evet koduna erişimim var ve iframe farklı bir alan
adında

@Matt, çerçevelerin diğer alanlardaki çerçevelerin içeriğinde değişiklik yapmasına izin verilmez. Bu etki alanları arası komut dosyası kısıtlamasıyla nasıl çalışılacağına ilişkin örnekler için şuna bakın: softwareas.com/cross-domain-communication-with-iframes
Ben Lee

Yanıtlar:


174

İframe farklı bir alanda değilse, böyle bir şey yapabilirsiniz:

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

Ancak iframe farklı bir alanda olduğundan, iframe'in contentDocumentmülküne aynı menşe politikasıyla erişiminiz engellenir .

Ancak, kodunuz iframe'in üst sayfasında çalışıyorsa, alan adı iframe'ini src niteliğini kendisine ayarlayarak hackishly haksız alan içi iframe'i yeniden yüklemeye zorlayabilirsiniz. Bunun gibi:

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

Başka iframe'deki iframe yeniden çalışıyorsanız, sen şans dışında olduğunu olduğunu değil mümkün.


19
Onun sorusu, Javascript ile değil bunu jQuery ile nasıl başaracağıydı. Doğru jQuery yanıtı için aşağıdaki Sime Vidas'ın gönderisine bakın.
FastTrack

2
Senaryo yok değil (diğer sürümünü kontrol değil) benim IE9 çalışırlar. Değişim contentDocument için contentWindow o IE9 üzerinde çalışmak yapar. document.getElementById(FrameID).contentWindow.location.reload(true);
Han He

3
Bu benim için işe yaramadı, ancak iframe.contentDocument.location=iframe.src; bunun yerine harika çalıştı gibi bir şey yaptım
glitchyme

3
Bu Jquery benim için bir cazibe gibi çalıştı:$('#map_iframe').attr('src', $('#map_iframe').attr('src'));
Topher Hunt

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

2
Kimliğe yalnızca bir referansı olduğu için + 1'ini değiştirmesi daha az olası ancak diğerini unutması
Matthew Lock

1
@NicolaeSurdu Ayrıca, bu:(function (elem) { elem.src = elem.src; }($('#iframe')[0]));
Šime Vidas

1
Bir iframe'i diğer içinden yeniden yüklemek için: $ ('# iframe', window.parent.document) .attr ('src', function (i, val) {return val;});
Tillito

Internet Explorer'da javascript çözümleri gibi document.getElementById(FrameID).contentWindow.location.reload(true);düzgün çalışmıyor. Bu cevap daha iyi çalışıyor.
BeyazKaplan

55

jquery de kullanabilirsiniz. Alex'in sadece JQuery kullanarak önerdiği şeyle aynı:

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

3
Bu çözümün avantajı okunabilirliktir. Vidas'ın cevabı kadar etkili olmasa da, ne olduğu açık.
Robert Egginton

Katılıyorum, ayrıca bu çözümün okunabilirliğini tercih etme eğilimindeyim
Yonatan Naor

var f = $('#iframeX') ; f.attr( 'src', f.attr( 'src' ))korumak ve okumak için daha sağlam olabilir
Andreas Dietrich

9

JQuery ile iframe'i yeniden yükleme

iframe içinde bir bağlantı yapmak id = "reload" ile söyleyelim sonra aşağıdaki kodu kullanın

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

ve tüm tarayıcılarla gitmeye hazırsınız.

HTML ile bir iframe'i yeniden yükleyin (Java Script gereksinimi yoktur)

Daha basit bir çözümü var: javaScript olmadan çalışan (FF, Webkit)

iframe'inizde bir çapa yapın

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

Bu çapa tıkladığınızda iframe'inizi yenileyin

Ancak iframe'inize gönderilen parametreniz varsa, aşağıdaki gibi yapın.

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

herhangi bir sayfa URL'sine ihtiyacınız yok çünkü -> target = "_ SELF" bunu sizin için yapın


9

jquery ile bunu kullanabilirsiniz:

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

Bu çözüm mevcut iframe'i yenilemek istiyorsanız, biz neredeyiz. Çok teşekkürler!
DaemonHK

5

Sadece Alex'in cevabını karşılıklıyorum ama jQuery ile

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

4

İşte başka bir yol

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

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

3

Yukarıdaki tüm örneklerin iframe'i sadece mevcut src ile değil, orijinal src ile yeniden yüklediğinden eminim.

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

Geçerli URL kullanılarak yeniden yüklenmelidir.


2

Web alanları arası iseniz, src'yi aynı URL'ye geri ayarlamak, konum karması değişse bile her zaman yeniden yüklemeyi tetiklemez.

URL'leri güncellediğimde yenilenmeyecek Twitter düğmesi iframe'leri manuel olarak oluştururken bu sorunla karşılaştım.

Twitter benzeri düğmeler şu şekildedir: .../tweet_button.html#&_version=2&count=none&etc=...

Twitter, url için belge parçasını kullandığından, karma / parçayı değiştirmek kaynağı yeniden yüklemedi ve düğme hedefleri yeni ajax yüklü içeriğimi yansıtmadı.

Yeniden yüklemeyi zorlamak için bir sorgu dizesi parametresi ekleyebilirsiniz (örneğin: "?_=" + Math.random() ancak özellikle Twitter'ın yaklaşımının önbelleğe almayı etkinleştirmeye çalıştığı bu örnekte bant genişliği harcanır.

Yalnızca karma etiketlerle değişen bir şeyi yeniden yüklemek için öğeyi kaldırmanız veya srciş parçacığının çıkmasını beklemeniz ve ardından geri atamanız gerekir. Sayfa hala önbelleğe alınmışsa, bu bir ağ isabeti gerektirmez, ancak çerçevenin yeniden yüklenmesini tetikler.

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

Güncelleme : Bu yaklaşımı kullanmak istenmeyen geçmiş öğeleri oluşturur. Bunun yerine, iframe öğesini her seferinde kaldırın ve yeniden oluşturun; bu, bu geri () düğmesinin beklendiği gibi çalışmasını sağlar. Ayrıca zamanlayıcı olması güzel.


2

Sadece Alex'in cevabını karşılık veriyoruz, ancak jQuery ile:

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

Veya küçük işlevi kullanabilirsiniz:

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

Umut ediyorum bu yardım eder.



1

Bu basit JavaScript ile mümkündür.

  • İFrame1'de, yüklenen gövde etiketinde çağrılan bir JavaScript işlevi yapın. Ben bir sunucu tarafı değişkeni ayarladığım kontrol var, bu yüzden iframe1 belirli bir eylem almadıysanız iframe2 JavaScript işlevini çalıştırmak için çalışmaz. Bunu, bir düğmeye basarak veya iframe1'de kullanmak istediğiniz bir işlev olarak ayarlayabilirsiniz.
  • Daha sonra iframe2'de, aşağıda listelediğim ikinci işleve sahipsiniz. İframe1'deki işlev temel olarak ana sayfaya gider ve daha sonra window.framesiframe2'de bir JavaScript işlevi başlatmak için sözdizimini kullanır . Sadece iframe2'nin id/ karakterini kullandığınızdan emin olun .namesrc
//function in iframe1
function refreshIframe2()
{
    if (<cfoutput>#didValidation#</cfoutput> == 1)
    {   
         parent.window.frames.iframe2.refreshPage();
    }
}

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

1

// sayfadaki tüm iframe'leri yenile

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'];

çapraz tarayıcı çözümü:

    ifrX.src = ifrX.contentWindow.location

bu özellikle <iframe> bir <form> öğesinin hedefi olduğunda kullanışlıdır


neden jQuery?! ne zaman basit js mevcut
bortunac

0

ÇÖZÜLDÜ! Size çalışan tek çözümü (en azından ASP.NET/IE/FF/Chrome'da) paylaşmak için stockoverflow'a kaydoluyorum! Buradaki fikir, bir divın innerHTML değerini geçerli innerHTML değeri ile değiştirmektir.

HTML snippet'i şöyledir:

<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>

Ve Javascript kodum:

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

Bu yardımcı olur umarım.


Bu yanıtta birden çok hata var: 1. ASP.NET bileşeni runat="server"değil , bu nedenle uygulanamaz; 2. neden tüm kapaklar IFRAME? 3. boyut öznitelik değerlerinin birimi yoktur; 4. frameborderkullanımdan kaldırıldı
Raptor

0

Kullanmalısın

[0] .src

iframe'in kaynağını ve URL'sini bulmak için üst öğenin aynı alanında olması gerekir.

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

0

böyle yapabilirsin

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

-5

Aşağıdaki çözüm kesinlikle işe yarayacaktır:

window.parent.location.href = window.parent.location.href;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.