Обратный вызов Javascript при завершении загрузки IFRAME?


Answers

Я использую jQuery, и на удивление это кажется загруженным, поскольку я только что протестировал и загрузил тяжелую страницу, и я не получил предупреждение в течение нескольких секунд, пока не увидел загрузку iframe:

$('#the_iframe').load(function(){
    alert('loaded!');
});

Поэтому, если вы не хотите использовать jQuery, посмотрите на их исходный код и посмотрите, работает ли эта функция по-разному с элементами iframe DOM, я буду смотреть на нее сам позже, когда мне интересно и опубликую здесь. Также я тестировал только последний хром.

Question

Мне нужно выполнить обратный вызов, когда IFRAME закончил загрузку. Я не контролирую контент в IFRAME, поэтому я не могу запустить обратный вызов.

Этот IFRAME программно создан, и мне нужно передать его данные как переменную в обратном вызове, а также уничтожить iframe.

Есть идеи?

РЕДАКТИРОВАТЬ:

Вот что у меня есть сейчас:

function xssRequest(url, callback)
{
    var iFrameObj = document.createElement('IFRAME');
    iFrameObj.src = url;            
    document.body.appendChild(iFrameObj);   

    $(iFrameObj).load(function() 
    {
        document.body.removeChild(iFrameObj);
        callback(iFrameObj.innerHTML);
    });
}

Этот обратный вызов перед загрузкой iFrame, поэтому обратный вызов не возвращает данных.




У меня есть аналогичный код в моих проектах, который отлично работает. Адаптация моего кода к вашей функции может заключаться в следующем:

function xssRequest(url, callback)
{
    var iFrameObj = document.createElement('IFRAME');
    iFrameObj.id = 'myUniqueID';
    document.body.appendChild(iFrameObj);       
    iFrameObj.src = url;                        

    $(iFrameObj).load(function() 
    {
        callback(window['myUniqueID'].document.body.innerHTML);
        document.body.removeChild(iFrameObj);
    });
}

Возможно, у вас есть пустой innerHTML, потому что (одна или обе причины): 1. вы должны использовать его против элемента body 2. вы удалили iframe с вашей страницы DOM




Я думаю, что событие загрузки правильное. Что не так, так это то, как вы используете для возврата контента из iframe content dom.

Вам нужен html страницы, загруженной в iframe, а не html объекта iframe.

Что вам нужно сделать, так это получить доступ к документу контента с помощью iFrameObj.contentDocument . Это возвращает dom страницы, загруженной внутри iframe, если она находится в том же домене текущей страницы.

Я бы отвлек содержимое до удаления iframe.

Я тестировал в firefox и opera.

Тогда я думаю, что вы можете восстановить свои данные с помощью $(childDom).html() или $(childDom).find('some selector') ...




Использование onload attrbute решит вашу проблему.

Вот пример.

function a() {
alert("Your iframe has been loaded");
}
<iframe src="https://.com" onload="a()"></iframe>

Это то, что вы хотите?

Щелкните здесь для получения дополнительной информации.




Я должен был сделать это в тех случаях, когда документы, такие как текстовые документы и pdf-файлы, были переданы в iframe и нашли решение, которое работает очень хорошо. Ключ обрабатывает событие onreadystatechanged в iframe.

Допустим, что имя вашего фрейма - «myIframe». Сначала где-то в вашем запуске кода (я делаю это inline, где после iframe) добавьте что-то вроде этого, чтобы зарегистрировать обработчик событий:

document.getElementById('myIframe').onreadystatechange = MyIframeReadyStateChanged;

Я не смог использовать атрибут onreadystatechage в iframe, я не могу вспомнить, почему, но приложение должно было работать в IE 7 и Safari 3, так что это может быть фактором.

Вот пример того, как получить полное состояние:

function MyIframeReadyStateChanged()
{
    if(document.getElementById('myIframe').readyState == 'complete')
    {
        // Do your complete stuff here.
    }
}





Related