Почему событие load
не запускается в IE для iFrames?
Пожалуйста, посмотрите этот пример.
Работайте отлично, как ожидалось, в FF и Chrome, но IE не работает.
Почему событие load
не запускается в IE для iFrames?
Пожалуйста, посмотрите этот пример.
Работайте отлично, как ожидалось, в FF и Chrome, но IE не работает.
Я думаю, что для iframe в Internet Explorer вы не можете программным образом настроить этот обработчик событий (onload), вам нужно указать его в своей разметке.
Что-то вроде:
<iframe id="myFrame" onload="myFunction();"></iframe>
В противном случае IE просто проигнорирует эту функцию.
IE, возможно, уже загрузил контент (и уволил событие), прежде чем добавить обработчик. Я обнаружил, что когда я статически указывал iframe src attr и добавлял обработчики событий $(x).load через jquery, firefox (3.6.28) вызывал мои обработчики, но IE (8.0.6001.18702) этого не делал.
Я закончил настройку своей тестовой программы, чтобы установить iframe src через javascript после добавления обработчика $(x).load. Мой обработчик $(x).load вызывался в тех же точках в IE и Firefox (но обратите внимание, что обработчик, добавленный через атрибут onload iframe, вел себя по-разному между 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 фактически загружен х:
Фред лиса.Назначение обработчика непосредственно onload
работает в Chrome, FF и IE (протестировано с IE 8).
(function (selector) {
var frame = $(selector).get(0);
if (frame) {
frame.onload = function () {
alert('frame loaded.');
};
}
})('#myframe');
Использование кода JavaScript с jQuery из здесь работает, если вы измените строку if ($.browser.safari || $.browser.opera) {
на if ($.browser.safari || $.browser.opera || $.browser.msie) {
. Итак, у вас есть следующее:
$(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';
});
}
});
Я использую событие readystatechange
для IE.
var $iframe = $("<iframe>");
$iframe.on("load readystatechange", callback);
Добавьте префикс "iframe" перед вашим id:
$('iframe#myFrame').load(function() {
...
});
Альтернативно попробуйте использовать "ready" вместо "load":
$('#myFrame').ready(function() {
alert("Loaded");
});
Это должно работать.
Ответ 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.