วิธีที่ดีที่สุดในการโหลด / รีเฟรช iframe คืออะไร


242

ฉันต้องการโหลด<iframe>JavaScript อีกครั้งโดยใช้ วิธีที่ดีที่สุดที่ฉันพบจนถึงตอนนี้ได้กำหนดsrcคุณลักษณะของ iframe ให้เป็นของตัวเอง แต่นี่ไม่ได้สะอาดมาก ความคิดใด ๆ


4
มีเหตุผลว่าทำไมการตั้งค่าsrcคุณลักษณะเพื่อตัวเองไม่สะอาด? ดูเหมือนว่าจะเป็นทางออกเดียวที่ใช้ได้กับเบราว์เซอร์และข้ามโดเมน
mirhagk

การตั้งค่าsrcแอตทริบิวต์กับตัวเองทำให้เกิดปัญหาถ้าคุณมีการเชื่อมโยงอื่น ๆ <iframe>ที่เป้าหมาย จากนั้นเฟรมจะแสดงหน้าเริ่มต้นตามที่ได้ออกแบบไว้
E. van Putten

คำตอบ:


222
document.getElementById('some_frame_id').contentWindow.location.reload();

ระวังใน Firefox window.frames[]ไม่สามารถจัดทำดัชนีด้วย ID แต่ตามชื่อหรือดัชนี


26
ที่จริงแล้ววิธีการนี้ใช้ไม่ได้กับฉันใน Chrome ไม่มีคุณสมบัติ 'contentWindow' แม้ว่ามันจะเป็นไปได้ที่จะใช้ document.getElementById ('some_frame_id'). location.reload (); วิธีการที่ใช้ได้ทั้ง FF และ Chrome คือ document.getElementById ('iframeid') src = document.getElementById ('iframeid') src
Mike Bevz

1
@ MikeBevz สามารถ location.reload สามารถเข้าถึงได้โดยใช้ Jquery selector?
Jitender Mahlawat

2
แน่นอนมันใช้งานได้ แต่ติดอยู่กับนโยบายกำเนิดโดเมนเดียวกัน == a
Bobby Stenly

6
frames[1].location.href.reload()และwindow.frames['some_frame_id'].location.href.reload()ยังสามารถใช้ได้
Daniël W. Crompton

1
หากคุณไม่สามารถเข้าถึงหน้าต่าง iframe ได้คุณจะต้องเปลี่ยนแอตทริบิวต์ src ของแท็ก iframe
Maciej Krawczyk

195
document.getElementById('iframeid').src = document.getElementById('iframeid').src

มันจะโหลดซ้ำอีกครั้งiframeแม้กระทั่งในทุกโดเมน! ทดสอบกับ IE7 / 8, Firefox และ Chrome


68
document.getElementById('iframeid').src += '';ยังใช้งานได้: jsfiddle.net/Daniel_Hug/dWm5k
Web_Designer

3
และคุณจะทำอย่างไรหากที่มาของ iframe เปลี่ยนไปตั้งแต่ถูกเพิ่มเข้าไปในหน้า?
Niet the Dark Absolute

ใช้งานได้กับ Chrome ver33! แปลกที่เราใช้ไม่ได้reloadแต่ได้รับอนุญาต
ลุค

8
โปรดทราบว่าหาก iframe src มีแฮชอยู่ (เช่นhttp://example.com/#something) สิ่งนี้จะไม่โหลดเฟรมใหม่ ฉันใช้วิธีการเพิ่มพารามิเตอร์ข้อความค้นหาแบบโยนทิ้ง?v2ลงใน URL ก่อนแฮช
user85461

นี่ทำให้ iframe เลื่อนกลับไปด้านบน
MrTux

60

หากใช้ jQuery สิ่งนี้ดูเหมือนจะใช้ได้:

$('#your_iframe').attr('src', $('#your_iframe').attr('src'));

ฉันหวังว่ามันจะไม่น่าเกลียดเกินไปสำหรับ stackoverflow


6
สิ่งนี้โดยไม่มี jQuery: var iframe = document.getElementById("your_iframe"); iframe.src = src;
Seagrass

โปรดทราบว่าผู้คนในอนาคตว่านี่ (และโซลูชัน js ธรรมดา) ดีที่สุดในการใช้เนื่องจากเป็นแพลตฟอร์มข้ามและทำงานข้ามโดเมน
mirhagk

13
@Seagrass ฉันคิดว่าคุณหมายถึง:var iframe = document.getElementById("your_iframe"); iframe.src = iframe.src;
maxisme

15

เพิ่มพื้นที่ว่างยังทำการโหลด iFrame อีกครั้งโดยอัตโนมัติ

document.getElementById('id').src += '';


8

เนื่องจากนโยบายกำเนิดเดียวกันนี้จะไม่ทำงานเมื่อแก้ไข iframe ที่ชี้ไปยังโดเมนอื่น หากคุณสามารถกำหนดเป้าหมายเบราว์เซอร์ใหม่พิจารณาใช้การส่งข้อความข้ามเอกสาร HTML5 ของ คุณสามารถดูเบราว์เซอร์ที่สนับสนุนคุณสมบัตินี้ที่นี่: http://caniuse.com/#feat=x-doc-messaging

ถ้าคุณไม่สามารถใช้ฟังก์ชั่น HTML5 แล้วคุณสามารถทำตามเทคนิคที่ระบุไว้ที่นี่: http://softwareas.com/cross-domain-communication-with-iframes รายการบล็อกนั้นยังทำงานได้ดีในการกำหนดปัญหา


7

ฉันเพิ่งพบกับโครเมี่ยมและสิ่งเดียวที่ทำงานได้ก็คือการลบและแทนที่ iframe ตัวอย่าง:

$(".iframe_wrapper").find("iframe").remove();
var iframe = $('<iframe src="' + src + '" frameborder="0"></iframe>');
$.find(".iframe_wrapper").append(iframe);

ค่อนข้างง่ายไม่ครอบคลุมในคำตอบอื่น ๆ


4

สำหรับ URL ใหม่

location.assign("http:google.com");

เมธอด assign () จะโหลดเอกสารใหม่

โหลด

location.reload();

วิธีการโหลด () ใช้ในการโหลดเอกสารปัจจุบัน


4

เพียงแทนที่srcแอตทริบิวต์ขององค์ประกอบ iframe ไม่เป็นที่พอใจในกรณีของฉันเพราะจะเห็นเนื้อหาเก่าจนกว่าจะโหลดหน้าใหม่ วิธีนี้ใช้งานได้ดีกว่าหากคุณต้องการแสดงความคิดเห็นทันที:

var url = iframeEl.src;
iframeEl.src = 'about:blank';
setTimeout(function() {
    iframeEl.src = url;
}, 10);

ฉันเพิ่งทดสอบวิธีการเดียวกัน แต่ไม่มี setTimeout - และมันใช้งานได้สำหรับฉัน จริง ๆ แล้วแค่ iframe.setAttribute ('src', iframe.getAttribute ('src'))
bonbonez

3

การปรับแต่งโพสต์ของ yajra ... ฉันชอบความคิด แต่เกลียดความคิดในการตรวจจับเบราว์เซอร์

ฉันค่อนข้างจะใช้มุมมองของ ppk ในการใช้การตรวจจับวัตถุแทนการตรวจจับเบราว์เซอร์ ( http://www.quirksmode.org/js/support.html ) เพราะจริงๆแล้วคุณกำลังทดสอบความสามารถของเบราว์เซอร์และดำเนินการตามความเหมาะสมมากกว่า สิ่งที่คุณคิดว่าเบราว์เซอร์มีความสามารถในเวลานั้น ยังไม่จำเป็นต้องแยกสตริง ID เบราว์เซอร์ที่น่าเกลียดมากและไม่แยกเบราว์เซอร์ที่มีความสามารถอย่างสมบูรณ์แบบซึ่งคุณไม่รู้อะไรเลย

ดังนั้นแทนที่จะดูที่ navigator.AppName ทำไมไม่ทำอย่างนี้ลองทดสอบองค์ประกอบที่คุณใช้จริง ๆ (คุณสามารถใช้ลอง {} บล็อกหากคุณต้องการได้รับนักเล่นที่ดีกว่านี้ แต่มันใช้ได้ผลกับฉัน)

function reload_message_frame() {
    var frame_id = 'live_message_frame';
    if(window.document.getElementById(frame_id).location ) {  
        window.document.getElementById(frame_id).location.reload(true);
    } else if (window.document.getElementById(frame_id).contentWindow.location ) {
        window.document.getElementById(frame_id).contentWindow.location.reload(true);
    } else if (window.document.getElementById(frame_id).src){
        window.document.getElementById(frame_id).src = window.document.getElementById(frame_id).src;
    } else {
        // fail condition, respond as appropriate, or do nothing
        alert("Sorry, unable to reload that frame!");
    }
}

ด้วยวิธีนี้คุณสามารถลองเปลี่ยนรูปแบบได้มากเท่าที่คุณต้องการหรือจำเป็นโดยไม่ก่อให้เกิดข้อผิดพลาดจาวาสคริปต์และทำสิ่งที่สมเหตุสมผลหากสิ่งอื่นล้มเหลว การทดสอบวัตถุของคุณเป็นเรื่องเล็ก ๆ น้อย ๆ ก่อนที่จะใช้งาน แต่ IMO ทำให้โค้ดที่ล้มเหลวดีขึ้นและมากขึ้น

ทำงานให้ฉันใน IE8, Firefox (15.0.1), Chrome (21.0.1180.89 m) และ Opera (12.0.2) บน Windows

บางทีฉันอาจจะทำได้ดีกว่านี้ด้วยการทดสอบฟังก์ชั่นโหลดซ้ำ แต่ตอนนี้ก็เพียงพอแล้วสำหรับฉัน :)


3

ตอนนี้ให้ใช้งานกับ chrome 66 ได้แล้วลองทำสิ่งนี้:

const reloadIframe = (iframeId) => {
    const el = document.getElementById(iframeId)
    const src = el.src
    el.src = ''
    setTimeout(() => {
        el.src = src
    })
}

2

ใน IE8 โดยใช้. Net การตั้งค่าเป็นiframe.srcครั้งแรกก็โอเค แต่การตั้งค่าiframe.srcเป็นครั้งที่สองไม่ได้เป็นการเพิ่มpage_loadหน้า iframed iframe.contentDocument.location.href = "NewUrl.htm"การแก้ปัญหามันผมใช้

ค้นพบมันเมื่อใช้ jQuery thickBox และพยายามที่จะเปิดหน้าเดียวกันใน thickbox iframe จากนั้นมันจะแสดงหน้าก่อนหน้าที่เปิดขึ้นมา


2

ใช้ reload สำหรับ IE และตั้งค่า src สำหรับเบราว์เซอร์อื่น (การโหลดซ้ำไม่ทำงานบน FF) ทดสอบบน IE 7,8,9 และ Firefox

if(navigator.appName == "Microsoft Internet Explorer"){
    window.document.getElementById('iframeId').contentWindow.location.reload(true);
}else {
    window.document.getElementById('iframeId').src = window.document.getElementById('iframeId').src;
}

2

หากคุณใช้ Jquery จะมีรหัสบรรทัดหนึ่งรหัส

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

และถ้าคุณทำงานกับผู้ปกครองเดียวกัน

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

1

หากสิ่งทั้งหมดข้างต้นไม่ได้ผลสำหรับคุณ:

window.location.reload();

ด้วยเหตุผลบางประการรีเฟรช iframe ของฉันแทนที่จะเป็นสคริปต์ทั้งหมด อาจเป็นเพราะมันอยู่ในเฟรมเองในขณะที่โซลูชัน getElemntById ทั้งหมดทำงานเมื่อคุณพยายามรีเฟรชเฟรมจากเฟรมอื่น

หรือฉันไม่เข้าใจสิ่งนี้อย่างเต็มที่และพูดคุยซึ่งพูดพล่อยๆไม่ว่าอย่างไรก็ตามสิ่งนี้ได้ผลกับฉันเหมือนมีเสน่ห์ :)


1

คุณได้พิจารณาเพิ่มพารามิเตอร์สตริงข้อความค้นหาที่ไม่มีความหมายต่อท้าย URL หรือไม่

<iframe src="myBaseURL.com/something/" />

<script>
var i = document.getElementsById("iframe")[0],
    src = i.src,
    number = 1;

//For an update
i.src = src + "?ignoreMe=" + number;
number++;
</script>

จะไม่ปรากฏให้เห็น & หากคุณทราบถึงพารามิเตอร์ที่ปลอดภัยแล้วก็ควรจะดี


1

ทางออกอื่น

const frame = document.getElementById("my-iframe");

frame.parentNode.replaceChild(frame.cloneNode(), frame);

ข้อเสียของสิ่งนั้นคือการแก้ไขทรีเอกสาร DOM ของรูทและจะทำให้เกิดการทาสีใหม่ ฉันใช้var url = ifr.src; ifr.src = null; ifr.src = url;
Pocketsand

ฉันคิดว่าการโหลด iframe จะทำให้เกิดการทาสีใหม่ไม่ว่าจะใช้รหัสใด
Vasile Alexandru Peşte

1

การใช้self.location.reload()จะโหลด iframe ใหม่

<iframe src="https://vivekkumar11432.wordpress.com/" width="300" height="300"></iframe>
<br><br>
<input type='button' value="Reload"  onclick="self.location.reload();" />


1
ที่โหลดหน้าต่างหลักทั้งหมดอีกครั้ง
pery mimon

0
<script type="text/javascript">
  top.frames['DetailFrame'].location = top.frames['DetailFrame'].location;
</script> 

1
ไม่ใช่ทางเลือกที่ฉันจะใช้ แต่ฉันเดาว่ามันจะทำ ด้วยรหัสเพิ่มเติมบางอย่างที่คุณสามารถเพิ่มได้
transilvlad

0

หากคุณลองใช้คำแนะนำอื่น ๆ ทั้งหมดและไม่สามารถทำงานให้ได้ (อย่างที่ทำไม่ได้) นี่เป็นสิ่งที่คุณสามารถลองได้ซึ่งอาจเป็นประโยชน์

HTML

<a class="refresh-this-frame" rel="#iframe-id-0">Refresh</a>
<iframe src="" id="iframe-id-0"></iframe>

JS

$('.refresh-this-frame').click(function() {
    var thisIframe = $(this).attr('rel');
    var currentState = $(thisIframe).attr('src');
    function removeSrc() {
        $(thisIframe).attr('src', '');
    }
    setTimeout (removeSrc, 100);
    function replaceSrc() {
        $(thisIframe).attr('src', currentState);
    }
    setTimeout (replaceSrc, 200);
});

เริ่มแรกฉันพยายามและประหยัดเวลาด้วย RWD และการทดสอบข้ามเบราว์เซอร์ ฉันต้องการสร้างหน้าเว็บด่วนที่มี iframe จำนวนหนึ่งจัดเรียงเป็นกลุ่มที่ฉันจะแสดง / ซ่อนตามประสงค์ เหตุผลคุณต้องสามารถรีเฟรชเฟรมที่กำหนดได้อย่างง่ายดายและรวดเร็ว

ฉันควรทราบว่าโครงการที่ฉันกำลังดำเนินการอยู่ในขณะนี้โครงการที่ใช้งานอยู่ในเตียงทดสอบนี้เป็นเว็บไซต์หนึ่งหน้าที่มีตำแหน่งที่จัดทำดัชนี (เช่น index.html # home) อาจมีบางสิ่งที่เกี่ยวข้องกับสาเหตุที่ฉันไม่สามารถแก้ไขปัญหาอื่น ๆ เพื่อรีเฟรชเฟรมเฉพาะของฉันได้

ต้องบอกว่าฉันรู้ว่าไม่ใช่สิ่งที่สะอาดที่สุดในโลก แต่ทำงานได้ตามวัตถุประสงค์ของฉัน หวังว่านี่จะช่วยใครซักคน ตอนนี้ถ้าฉันสามารถคิดได้ว่าจะป้องกันไม่ให้ iframe เลื่อนหน้าหลักในแต่ละครั้งที่มีภาพเคลื่อนไหวอยู่ใน iframe ...

แก้ไข: ฉันรู้ว่านี่ไม่ใช่ "รีเฟรช" iframe เหมือนที่ฉันคาดหวัง มันจะโหลดซ้ำแหล่งที่มาเริ่มต้นของ iframe ยังไม่สามารถเข้าใจได้ว่าทำไมฉันจึงไม่สามารถใช้ตัวเลือกอื่น ๆ ในการทำงานได้ ..

อัปเดต: เหตุผลที่ฉันไม่สามารถใช้วิธีการอื่นได้เนื่องจากฉันทดสอบใน Chrome และ Chrome จะไม่อนุญาตให้คุณเข้าถึงเนื้อหาของ iframe (คำอธิบาย: เป็นไปได้หรือไม่ว่า Chrome จะรองรับเนื้อหาในอนาคต Windows ในอนาคต / contentDocument เมื่อ iFrame โหลดไฟล์ html แบบโลคัลจากไฟล์ html แบบโลคัล? ) หากไม่ได้มาจากตำแหน่งเดียวกัน (เท่าที่ฉันเข้าใจ) เมื่อทำการทดสอบเพิ่มเติมฉันไม่สามารถเข้าถึง contentWindow ใน FF ได้เช่นกัน

แก้ไขแล้ว JS

$('.refresh-this-frame').click(function() {
    var targetID = $(this).attr('rel');
    var targetSrc = $(targetID).attr('src');
    var cleanID = targetID.replace("#","");     
    var chromeTest = ( navigator.userAgent.match(/Chrome/g) ? true : false );
    var FFTest = ( navigator.userAgent.match(/Firefox/g) ? true : false );      
    if (chromeTest == true) {
        function removeSrc() {
            $(targetID).attr('src', '');
        }
        setTimeout (removeSrc, 100);
        function replaceSrc() {
            $(targetID).attr('src', targetSrc);
        }
        setTimeout (replaceSrc, 200);
    }
    if (FFTest == true) {
        function removeSrc() {
            $(targetID).attr('src', '');
        }
        setTimeout (removeSrc, 100);
        function replaceSrc() {
            $(targetID).attr('src', targetSrc);
        }
        setTimeout (replaceSrc, 200);
    }       
    if (chromeTest == false && FFTest == false) {
        var targetLoc = (document.getElementById(cleanID).contentWindow.location).toString();
        function removeSrc() {
            $(targetID).attr('src', '');
        }
        setTimeout (removeSrc, 100);
        function replaceSrc2() {
            $(targetID).attr('src', targetLoc);
        }
        setTimeout (replaceSrc2, 200);
    }
});

0

สำหรับวัตถุประสงค์ในการแก้ไขข้อบกพร่องหนึ่งสามารถเปิดคอนโซลเปลี่ยนบริบทการดำเนินการกับเฟรมที่เขาต้องการรีเฟรชและทำ document.location.reload()

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.