จับภาพเหตุการณ์ที่สมบูรณ์ของการโหลด iframe


คำตอบ:


210

<iframe>องค์ประกอบมีloadเหตุการณ์สำหรับสิ่งนั้น


วิธีที่คุณฟังเหตุการณ์นั้นขึ้นอยู่กับคุณ แต่โดยทั่วไปวิธีที่ดีที่สุดคือ:

1) สร้าง iframe ของคุณโดยใช้โปรแกรม

ทำให้แน่ใจว่าloadผู้ฟังของคุณถูกเรียกใช้เสมอโดยการแนบก่อนที่ iframe จะเริ่มโหลด

<script>
var iframe = document.createElement('iframe');
iframe.onload = function() { alert('myframe is loaded'); }; // before setting 'src'
iframe.src = '...'; 
document.body.appendChild(iframe); // add it to wherever you need it in the document
</script>

2) จาวาสคริปต์แบบอินไลน์เป็นอีกวิธีหนึ่งที่คุณสามารถใช้ภายในมาร์กอัป HTML ของคุณ

<script>
function onMyFrameLoad() {
  alert('myframe is loaded');
};
</script>

<iframe id="myframe" src="..." onload="onMyFrameLoad(this)"></iframe>

3) คุณยังสามารถแนบตัวฟังเหตุการณ์หลังองค์ประกอบภายใน<script>แท็กได้ แต่โปรดทราบว่าในกรณีนี้มีโอกาสเล็กน้อยที่ iframe จะโหลดแล้วเมื่อคุณเพิ่ม Listener ของคุณ ดังนั้นจึงเป็นไปได้ว่าจะไม่ถูกเรียกใช้ (เช่น iframe เร็วมากหรือมาจากแคช)

<iframe id="myframe" src="..."></iframe>

<script>
document.getElementById('myframe').onload = function() {
  alert('myframe is loaded');
};
</script>

ดูคำตอบอื่น ๆ ของฉันเกี่ยวกับองค์ประกอบที่สามารถทำให้เกิดloadเหตุการณ์ประเภทนี้ได้


2
ขอบคุณนี่เป็นสิ่งที่ฉันต้องการจริงๆ!
Jaime Garcia

1
ด้วยวิธีนี้คุณสามารถเรียกใช้ฟังก์ชันเดียวเมื่อโหลด iframe ดูคำตอบของฉันด้านล่างโดยใช้addEventListenerซึ่งอนุญาตให้เรียกกลับหลายรายการในเหตุการณ์โหลด
Iest

1
วิธีนี้ยังเสี่ยงต่อสภาวะการแย่งชิงเนื่องจาก iframe สามารถโหลดได้ก่อนที่จะเรียกใช้แท็กสคริปต์
Iest

7
เหตุการณ์การโหลดไม่ทำงานเมื่อคุณพยายามดาวน์โหลดไฟล์
Jerry

1
ใช่นั่นใช้ไม่ได้ใน IE หากเนื้อหา iFrame ไม่ใช่ HTML เช่น PDF ดูสิ่งนี้: connect.microsoft.com/IE/feedback/details/809377/…
Sergey Gussak

28

คำตอบทั้งสองข้อข้างต้นไม่ได้ผลสำหรับฉัน แต่สิ่งนี้ได้ผล

อัพเดท :

ดังที่ @doppleganger ระบุไว้ด้านล่างการโหลดจะหายไปเมื่อ jQuery 3.0 ดังนั้นนี่คือเวอร์ชันอัปเดตที่ใช้onไฟล์. โปรดทราบว่าสิ่งนี้จะใช้งานได้จริงบน jQuery 1.7+ ดังนั้นคุณสามารถใช้งานได้ด้วยวิธีนี้แม้ว่าคุณจะยังไม่ได้ใช้ jQuery 3.0 ก็ตาม

$('iframe').on('load', function() {
    // do stuff 
});

1
เมื่อ jQuery 3.0 loadหายไปแล้ว กรุณาใช้.on('load', function() { ... })แทน
Doppelganger

ถ้าใช้ของคุณjqueryหรือjqLiteแล้วนี่คือวิธีที่จะไป!
ปีเตอร์

11

มีอีกวิธีหนึ่งที่สอดคล้องกัน ( สำหรับ IE9 + เท่านั้น ) ใน vanilla JavaScript สำหรับสิ่งนี้:

const iframe = document.getElementById('iframe');
const handleLoad = () => console.log('loaded');

iframe.addEventListener('load', handleLoad, true)

และหากคุณสนใจObservablesสิ่งนี้จะใช้เคล็ดลับ:

return Observable.fromEventPattern(
  handler => iframe.addEventListener('load', handler, true),
  handler => iframe.removeEventListener('load', handler)
);

เป็นข้อกังวลหรือไม่ที่ดีบักเกอร์ของฉันหยุดที่เบรกพอยต์handleLoad()ก่อนที่ฉันจะเห็นการเรนเดอร์ iFrame ฉันหวังว่านั่นเป็นปัญหาในการแสดงผลมากกว่าปัญหาการโหลดเนื้อหา
Sridhar Sarnobat

วิธีการจับเหตุการณ์นั้นโดย jquery เมื่อ iframe มีอยู่แล้ว ... เช่น: jquery ไม่ได้สร้าง iframe
gumuruh

3

โปรดทราบว่าเหตุการณ์ onload ดูเหมือนจะไม่เริ่มทำงานหากโหลด iframe เมื่อปิดหน้าจอ ซึ่งมักเกิดขึ้นเมื่อใช้แท็บ "เปิดในหน้าต่างใหม่" / w


2
นอกจากนี้ยังมี iframe ที่ไม่มีการแสดงผล;)
Felipe N Moura

1

คุณยังสามารถจับภาพเหตุการณ์ที่พร้อมใช้งาน jquery ได้ด้วยวิธีนี้:

$('#iframeid').ready(function () {
//Everything you need.
});

นี่คือตัวอย่างการทำงาน:

http://jsfiddle.net/ZrFzF/


17
ฉันไม่คิดว่าโค้ดนั้นทำอย่างที่คุณคิด คุณสามารถแทนที่ตัวเลือก "#iFrame" ในซอของคุณด้วยอะไรก็ได้และการแจ้งเตือนยังคงทำงานอยู่
roryok

7
นอกจาก @roryok แล้วการเตรียมพร้อมเมื่อ DOM พร้อมไม่ใช่การโหลดทั้งหน้า
Ivan Nikitin

1
ready จะเริ่มทำงานเมื่อ DOM พร้อมและสามารถดำเนินการ js ได้ไม่ใช่เมื่อโหลดเนื้อหา
Sergey Gussak

2
$ ("# iframeid") พร้อมทริกเกอร์ฟังก์ชันเมื่อองค์ประกอบอยู่ในโดม ไม่ใช่เมื่อโหลด ifram เสร็จแล้ว
Popsyjunior

เพิ่งเรียกครั้งเดียว :(
Hossein Badrnezhad

1

ขั้นตอนที่ 1:เพิ่มiframeในเทมเพลต

<iframe id="uvIFrame" src="www.google.com"></iframe>

ขั้นตอนที่ 2:เพิ่ม load listener ใน Controller

document.querySelector('iframe#uvIFrame').addEventListener('load', function () {
  $scope.loading = false;
  $scope.$apply();
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.