Nắm bắt sự kiện tải hoàn thành iframe


Câu trả lời:


196

<iframe>các yếu tố có một loadsự kiện cho điều đó.


Cách bạn nghe sự kiện đó là tùy thuộc vào bạn, nhưng nói chung cách tốt nhất là:

1) tạo iframe của bạn theo chương trình

Nó đảm bảo rằng trình loadnghe của bạn luôn được gọi bằng cách đính kèm trước khi iframe bắt đầu tải.

<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) javascript nội tuyến , là một cách khác mà bạn có thể sử dụng bên trong đánh dấu HTML của mình.

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

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

3) Bạn cũng có thể đính kèm trình lắng nghe sự kiện sau phần tử , bên trong <script>thẻ, nhưng hãy nhớ rằng trong trường hợp này, có một khả năng nhỏ là iframe đã được tải vào thời điểm bạn thêm trình nghe của mình. Do đó, có thể nó sẽ không được gọi (ví dụ: nếu iframe rất nhanh hoặc đến từ bộ đệm).

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

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

Cũng xem câu trả lời khác của tôi về yếu tố nào cũng có thể kích hoạt loại loadsự kiện này


2
Cảm ơn, điều này làm chính xác những gì tôi cần!
Jaime Garcia

1
Với phương pháp này, bạn chỉ có thể chạy một hàm duy nhất khi iframe được tải. Xem câu trả lời của tôi dưới đây bằng cách addEventListenercho phép nhiều cuộc gọi lại chạy trên sự kiện tải.
Iest

1
Cách tiếp cận này cũng dễ bị tổn thương trong điều kiện cuộc đua vì iframe có thể tải trước khi thẻ script được thực thi.
Iest

7
Sự kiện tải không hoạt động khi bạn cố tải xuống một tệp.
Jerry

1
Có, điều đó không hoạt động trong IE nếu nội dung iFrame không phải là HTML, ví dụ PDF. Xem điều này: connect.microsoft.com/IE/feedback/details/809377/ cường
Serge Gussak

27

Cả hai câu trả lời trên đều không có tác dụng với tôi, tuy nhiên điều này đã làm

CẬP NHẬT :

Như @doppleganger đã chỉ ra bên dưới, tải đã hết từ jQuery 3.0, vì vậy đây là phiên bản cập nhật sử dụng on. Xin lưu ý rằng điều này thực sự sẽ hoạt động trên jQuery 1.7+, vì vậy bạn có thể triển khai theo cách này ngay cả khi bạn chưa sử dụng jQuery 3.0.

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

1
Kể từ jQuery 3.0, loadđã biến mất. Vui lòng sử dụng .on('load', function() { ... })thay thế.
Doppelganger

Nếu bạn sử dụng jqueryhoặc jqLitesau đó đây là cách để đi!
Peter

11

Có một cách nhất quán khác ( chỉ dành cho IE9 + ) trong JavaScript vanilla cho việc này:

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

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

Và nếu bạn quan tâm đến Đài quan sát thì đây là mẹo:

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

Có phải mối quan tâm là trình gỡ lỗi của tôi dừng ở điểm dừng của tôi handleLoad()trước khi tôi thấy kết xuất iFrame không? Tôi hy vọng đó hoàn toàn là một vấn đề kết xuất chứ không phải là vấn đề tải nội dung.
Sridhar Sarnobat

làm thế nào để nắm bắt sự kiện đó bằng jquery khi iframe đã có sẵn ... tức là: iframe không được tạo bởi jquery.
gumuruh

3

Lưu ý rằng sự kiện onload dường như không kích hoạt nếu iframe được tải khi ngoài màn hình. Điều này thường xảy ra khi sử dụng tab "Mở trong cửa sổ mới" / w.


2
cũng với iframe không hiển thị;)
Felipe N Moura

1

Bạn cũng có thể chụp sự kiện sẵn sàng jquery theo cách này:

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

Dưới đây là một ví dụ hoạt động:

http://jsfiddle.net/ZrFzF/


16
Tôi không nghĩ rằng mã làm những gì bạn nghĩ nó làm. Bạn có thể thay thế bộ chọn "#iFrame" đó trong fiddle của mình bằng bất cứ thứ gì và cảnh báo vẫn kích hoạt
roryok

6
Ngoài @roryok, sẵn sàng kích hoạt khi DOM sẵn sàng, không tải toàn bộ trang.
Ivan Nikitin

1
sẵn sàng được kích hoạt khi DOM sẵn sàng và js có thể được thực thi, không phải khi nội dung được tải.
Serge Gussak

2
$ ("# iframeid"). sẵn sàng kích hoạt chức năng khi phần tử nằm trong dom. Không phải khi ifram đã tải xong.
Popsyjunior

nó chỉ được gọi một lần :(
Hossein Badrnezhad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.