Мне нужно выполнить обратный вызов, когда загрузка 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, поэтому данные обратного вызова не возвращаются.
javascript
events
dom
iframe
FlySwat
источник
источник
Ответы:
Во-первых, переходя к названию функции xssRequest, это звучит так, как будто вы пытаетесь выполнить межсайтовый запрос - что, если это правильно, вы не сможете прочитать содержимое iframe.
С другой стороны, если URL-адрес iframe находится в вашем домене, вы можете получить доступ к телу, но я обнаружил, что если я использую тайм-аут для удаления iframe, обратный вызов работает нормально:
источник
$('body', this.contentWindow.document).html()
наthis.contentDocument.body.outerHTML
load
ушел. Пожалуйста, используйте.on('load', function() { ... })
вместо этого.Я использую jQuery, и на удивление это похоже на загрузку, так как я только что протестировал и загрузил тяжелую страницу, и я не получал предупреждение в течение нескольких секунд, пока не увидел загрузку iframe:
Поэтому, если вы не хотите использовать jQuery, взгляните на их исходный код и посмотрите, не ведет ли себя эта функция по-разному с элементами iframe DOM, я сам посмотрю на нее позже, когда мне будет интересно, и опубликую здесь. Также я тестировал только на последнем хроме.
источник
load
ушел. Пожалуйста, используйте.on('load', function() { ... })
вместо этого.Внутренний HTML-код вашего iframe пуст, поскольку ваш тег iframe не окружает содержимое родительского документа. Чтобы получить содержимое со страницы, на которую ссылается атрибут src iframe, вам необходимо получить доступ к свойству iframe contentDocument. Исключение будет выдано, если src из другого домена. Это функция безопасности, которая предотвращает выполнение произвольного JavaScript на чужой странице, что может привести к уязвимости межсайтового скриптинга. Вот пример кода, иллюстрирующий то, о чем я говорю:
Чтобы продолжить пример, попробуйте использовать это в качестве содержимого iframe:
источник
Мне приходилось делать это в тех случаях, когда такие документы, как word docs и pdfs, передавались в iframe и находили решение, которое работает довольно хорошо. Ключ обрабатывает
onreadystatechanged
событие в iframe.Допустим, имя вашего фрейма "myIframe". Сначала где-то в вашем коде запуска (я делаю это в любом месте после iframe) добавить что-то вроде этого, чтобы зарегистрировать обработчик событий:
Я не смог использовать атрибут onreadystatechage в iframe, я не могу вспомнить почему, но приложение должно было работать в IE 7 и Safari 3, так что это может быть фактором.
Вот пример того, как получить полное состояние:
источник
Я хотел скрыть ожидающий div, когда содержимое i-кадра полностью загружено в IE, я пробовал буквально все решения, упомянутые в Stackoverflow.Com, но ничего не получалось, как я хотел.
Тогда у меня появилась идея, что когда содержимое i-кадра полностью загружено, событие загрузки $ (Window) может быть запущено. И это именно то, что случилось. Итак, я написал этот небольшой сценарий и работал как по волшебству:
Надеюсь это поможет.
источник
У меня была такая же проблема, как и у вас. Что я сделал, так это то, что я использую что-то под названием jQuery. То, что вы затем делаете в коде JavaScript, это:
Кажется, когда вы удаляете свой iFrame, прежде чем взять HTML из него. Теперь я вижу проблему с этим: р
Надеюсь это поможет :).
источник
У меня есть похожий код в моих проектах, который отлично работает. Адаптируя мой код к вашей функции, решение может быть следующим:
Возможно, у вас есть пустой innerHTML, потому что (одна или обе причины): 1. вы должны использовать его против элемента body 2. вы удалили iframe из DOM вашей страницы
источник
Я думаю, что событие загрузки правильно. Неправильно то, что вы используете для извлечения контента из iframe контента dom.
Что вам нужно, это HTML-код страницы, загруженной в iframe, а не HTML-код объекта iframe.
Что вам нужно сделать, это получить доступ к содержанию документа с
iFrameObj.contentDocument
. Это возвращает доменное имя страницы, загруженной в iframe, если она находится в том же домене текущей страницы.Я хотел бы получить содержимое, прежде чем удалить iframe.
Я тестировал в Firefox и Opera.
Тогда я думаю, что вы можете получить свои данные с помощью
$(childDom).html()
или$(childDom).find('some selector') ...
источник
У меня была точно такая же проблема в прошлом, и единственный способ найти ее - это добавить обратный вызов на страницу iframe. Конечно, это работает только тогда, когда у вас есть контроль над содержанием iframe.
источник
Использование
onload
attrbute решит вашу проблему.Вот пример.
Это то, что вы хотите?
Нажмите здесь для получения дополнительной информации.
источник