回答
我認爲對於IE中的iframe,你不能通過編程設置事件處理程序(onload),你需要在你的標記中指定它。
喜歡的東西:
<iframe id="myFrame" onload="myFunction();"></iframe>
否則IE只是要忽略的功能。
添加前綴 「IFRAME」 您的帳號面前:
$('iframe#myFrame').load(function() {
...
});
Alternativly嘗試使用 「準備」,而不是 「負擔」:
$('#myFrame').ready(function() {
alert("Loaded");
});
這應該工作。
直接指定處理程序到onload
可在Chrome,FF和IE中使用(使用IE 8測試)。
(function (selector) {
var frame = $(selector).get(0);
if (frame) {
frame.onload = function() {
alert('frame loaded.');
};
}
})('#myframe');
在添加處理程序之前,IE可能已經加載了內容(並觸發了該事件)。我發現,當我靜態指定iframe src attr,並通過jquery添加$(x).load事件處理程序時,firefox(3.6.28)觸發了我的處理程序,但IE(8.0.6001.18702)沒有。
我最終調整了測試程序,以便在添加$(x).load處理程序後,通過javascript設置iframe src。我的$(x).load處理程序在IE和Firefox的相同點處調用(但注意通過iframe onload屬性添加的處理程序在IE和FF之間的行爲不同)。以下是我結束了:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<script type="text/javascript" src="jquery-ui/js/jquery-1.6.2.min.js"></script>
<script language="javascript">
function show_body(name, $iframe) {
$('.log').append(name+': '+$iframe.contents().find('body').html()+'<br/>');
}
function actuallyLoaded(name, x) {
$('.log').append(name+' actually loaded<br/>');
}
$(document).ready(function(){
$('.i1').load(function(){show_body('i1', $('.i1'));});
$('.i1').attr('src', 'eb_mce_iframe_content.html');
var $x=$('.i1').clone().removeClass('i1');
$('body').append($x);
$x.load(function(){show_body('x', $x);});
$x.attr('src', 'eb_mce_iframe_content.html');
});
</script>
</head>
<body>
<iframe class="i1" onload="actuallyLoaded($(this).attr('class')+'/'+$(this).attr('src'), this);">
</iframe>
<div class="log">
</div>
</body>
</html>
...這裏是Firefox的 「日誌」:
I1/eb_mce_iframe_content.html實際加載 I1:
弗雷德狐狸。
/eb_mce_iframe_content.html實際加載 X:
弗雷德狐狸。
如果將if ($.browser.safari || $.browser.opera) {
行更改爲if ($.browser.safari || $.browser.opera || $.browser.msie) {
,則在here中對jQuery使用JavaScript代碼將起作用。所以你有以下幾點:
$(function(){
var iFrames = $('iframe');
function iResize() {
for (var i = 0, j = iFrames.length; i < j; i++) {
iFrames[i].style.height = iFrames[i].contentWindow.document.body.offsetHeight + 'px';}
}
if ($.browser.safari || $.browser.opera || $.browser.msie) {
iFrames.load(function(){
setTimeout(iResize, 0);
});
for (var i = 0, j = iFrames.length; i < j; i++) {
var iSource = iFrames[i].src;
iFrames[i].src = '';
iFrames[i].src = iSource;
}
} else {
iFrames.load(function() {
this.style.height = this.contentWindow.document.body.offsetHeight + 'px';
});
}
});
seis的答案是正確的,可以改進使用非全局/匿名函數。
window.dummy_for_ie7 = function() { }
var iframe = $('<iframe onload="dummy_for_ie7" />')[0];
iframe.attachEvent('onload', real_event_handler)
令我吃驚的是,這個工程。
注意:iframe。onload = func()將不起作用,即使在那之後。你必須使用attachEvent。去搞清楚。
注意:自然,此代碼逐字將無法在符合標準的UA中工作。
我對IE使用readystatechange
事件。
var $iframe = $("<iframe>");
$iframe.on("load readystatechange", callback);
感謝,但「準備就緒」事件被iFrame的內容之前觸發加載... – Muleskinner 2010-12-02 11:45:15
加前綴的iframe不工作(IE 8) – Muleskinner 2010-12-02 13:47:44
它不工作在IE 9 – Damiox 2011-09-04 01:22:22