JQuery onload -.load() - событие не работает с динамически загруженным iframe

My script загружает iframe, когда пользователь нажимает кнопку. Я хочу вызвать другую функцию после загрузки iframe, но она не работает. Iframe действительно загружается нормально, но событие .load() никогда не вызывается после завершения загрузки iframe. IFrame содержит контент с одного и того же веб-сайта (без внешнего содержимого). Странно то, что я использую тот же метод, описанный ниже, в нескольких других пунктах моего кода, и он отлично работает. Может кто-нибудь предложить, что я должен проверить в следующий раз?

Вот соответствующий код:

$('#myIframe').load(function () {
    alert('iframe loaded');
});

$('#someButton').live('click', function () {
    $('body').append($('<iframe id="myIframe" src="https://www.mywebsite.com" width="100%"></iframe>'));
});

Ответ 1

Кажется несколько похожим на вопрос здесь:

jQuery.ready в динамически вставленном iframe

Таким образом, элемент Iframe существует в Dom с добавлением. Только когда вы установите Url, он загрузится, и к этому моменту вы добавили функцию загрузки, которую вы хотите пометить в конце. Итак, для вашего кода

$('#someButton').live('click', function () {

    $('body').append($('<iframe id="myIframe" width="100%"></iframe>'));
    $('#myIframe').attr('src',"https://www.mywebsite.com");

    $('#myIframe').load(function () {
        alert('iframe loaded');
    });

});

Ответ 2

Причина, по которой ваш пример кода не работает, заключается в том, что вы привязываетесь к элементу, который не существует, а затем помещаем этот элемент в DOM, когда он не имеет обработчика событий, прикрепленного к событию load. Попробуйте следующее:

$('#someButton').live('click', function () {
    var $iframe = $('<iframe id="myIframe" src="" width="100%"></iframe>').load(function () {
        alert('iframe loaded');
    }).attr('src', 'https://www.mywebsite.com');
    $('body').append($iframe);
});

Или ближе к вашему исходному коду, вы можете заменить .load() на .live('load'):

$('#myIframe').live('load', function () {
    alert('iframe loaded');
});

$('#someButton').live('click', function () {
    $('body').append('<iframe id="myIframe" src="https://www.mywebsite.com" width="100%"></iframe>');//notice I removed the $() around the append code as it is unnecessary
});

Ответ 3

Попробуйте следующее:

$("<iframe id='myId'></iframe>").appendTo("body")
    .attr('src', url)
    .load(function() 
     {
         callback(this);
     });

Просто добавил цепочку, создав элемент, в котором обычно идет селектор (это возможно), и приложил его к телу.

Ответ 4

Если документ, который вы загружаете в iframe, вы контролируете, попробуйте поместить обработчик нагрузки в этот документ. Если вам нужен родительский документ, чтобы что-то сделать после загрузки iframe, вы можете вызвать функцию в родительском элементе из дочернего элемента:

// in parent doc
function myIframeLoaded() {
   // do something
}

// in iframe doc
$(document).load(function() {   // or .ready()
   parent.myIframeLoaded();
}