Событие загрузки для iFrame не запущено в IE - PullRequest
24 голосов
/ 02 декабря 2010

Почему событие load не запускается в IE для iFrames?

Пожалуйста, посмотрите на этот пример .

Работает идеально, как ожидается в FF иChrome, но IE не работает.

Ответы [ 7 ]

26 голосов
/ 21 декабря 2010

Я думаю, что для iframes в Internet Explorer вы не можете установить этот обработчик событий (onload) программно, вам нужно указать его в вашей разметке.

Что-то вроде:

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

В противном случае IE просто будет игнорировать функцию.

2 голосов
/ 27 марта 2012

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 (но обратите внимание, что обработчик, добавленный с помощью атрибута 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 фактически загружен х:

Фред лиса.

1 голос
/ 10 декабря 2015

Я использую readystatechange событие для IE.

var $iframe = $("<iframe>");
$iframe.on("load readystatechange", callback);
1 голос
/ 09 июля 2012

Использование кода 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';
           });
        }

    });
1 голос
/ 10 февраля 2012

Назначение обработчика непосредственно для onload работает в Chrome, FF и IE (протестировано с IE 8).

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

    if (frame) {
        frame.onload = function () {
            alert('frame loaded.');
        };
    }
})('#myframe');
0 голосов
/ 15 июля 2013

Ответ Сейса правильный, и его можно улучшить, используя неглобальные / анонимные функции.

window.dummy_for_ie7 = function() { }
var iframe = $('<iframe onload="dummy_for_ie7" />')[0];
iframe.attachEvent('onload', real_event_handler)

К моему удивлению, это работает.

Примечание: iframe.onload= func () НЕ будет работать, даже после этого взлома.Вы ДОЛЖНЫ использовать attachEvent.Go figure.

Примечание: естественно, этот код дословно не будет работать в стандартных UA.

0 голосов
/ 02 декабря 2010

Добавьте префикс «iframe» перед вашим идентификатором:

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

Альтернативно попробуйте использовать «ready» вместо «load»:

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

Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...