2010-12-02 76 views

回答

24

我認爲對於IE中的iframe,你不能通過編程設置事件處理程序(onload),你需要在你的標記中指定它。

喜歡的東西:

<iframe id="myFrame" onload="myFunction();"></iframe> 

否則IE只是要忽略的功能。

0

添加前綴 「IFRAME」 您的帳號面前:

$('iframe#myFrame').load(function() { 
    ... 
}); 

Alternativly嘗試使用 「準備」,而不是 「負擔」:

$('#myFrame').ready(function() { 
    alert("Loaded"); 
}); 

這應該工作。

+0

感謝,但「準備就緒」事件被iFrame的內容之前觸發加載... – Muleskinner 2010-12-02 11:45:15

+0

加前綴的iframe不工作(IE 8) – Muleskinner 2010-12-02 13:47:44

+0

它不工作在IE 9 – Damiox 2011-09-04 01:22:22

1

直接指定處理程序到onload可在Chrome,FF和IE中使用(使用IE 8測試)。

(function (selector) { 
    var frame = $(selector).get(0); 

    if (frame) { 
     frame.onload = function() { 
      alert('frame loaded.'); 
     }; 
    } 
})('#myframe'); 
2

在添加處理程序之前,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:

弗雷德狐狸。

1

如果將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'; 
      }); 
     } 

    }); 
0

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中工作。

1

我對IE使用readystatechange事件。

var $iframe = $("<iframe>"); 
$iframe.on("load readystatechange", callback);