答案 0 :(得分:26)
我认为对于Internet Explorer中的iframe,您无法以编程方式设置该事件处理程序(onload),您需要在标记中指定它。
类似的东西:
<iframe id="myFrame" onload="myFunction();"></iframe>
否则IE只会忽略该功能。
答案 1 :(得分: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“log”:
i1 / eb_mce_iframe_content.html实际已加载 I1:
弗雷德狐狸。/eb_mce_iframe_content.html实际已加载 X:
弗雷德狐狸。答案 2 :(得分:1)
将处理程序直接分配给onload
适用于Chrome,FF和IE(使用IE 8测试)。
(function (selector) {
var frame = $(selector).get(0);
if (frame) {
frame.onload = function () {
alert('frame loaded.');
};
}
})('#myframe');
答案 3 :(得分: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';
});
}
});
答案 4 :(得分:1)
我为IE使用readystatechange
事件。
var $iframe = $("<iframe>");
$iframe.on("load readystatechange", callback);
答案 5 :(得分:0)
在您的ID前添加前缀“iframe”:
$('iframe#myFrame').load(function() {
...
});
Alternativly尝试使用“ready”而不是“load”:
$('#myFrame').ready(function() {
alert("Loaded");
});
这应该有用。
答案 6 :(得分: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。去图。
注意:当然,此代码 verbatim 不适用于符合标准的UA。