Iframe не загружается в IE после установки обновления KB3154070
У нас есть приложение, которое в основном имеет дело с iframes (загружает разные страницы в приложении по запросу)
Недавно браузер IE был обновлен с помощью KB3154070 (Текущая версия IE: 11.0.9600.18314) как часть системных обновлений. После этого обновления большинство функций полностью ломается. Он выполнял все страницы, использующие iframes. Содержимое не загружается и приводит к пустой странице. Запрос, по-видимому, прерывается при проверке на сетевой панели, как показано на рисунке ниже.
Захват сетевого трафика
Мы выполнили следующее устранение неполадок
Мы убедились, что все теги iframe закрыты правильно.
Src iframe не пуст.
Если мы заходим на одну страницу за пределами (без загрузки в iframe), она работает нормально. Но проблема только в iframe.
В качестве быстрого решения этой проблемы мы попросили наших пользователей отменить обновление. Но это не ожидаемое решение.
Ваша помощь действительно оценена.
С уважением,
Swajay.
Ответы
Ответ 1
Ответ @Matt дает ключ к решению проблемы. Похоже, что IE с установленным KB3154070 блокирует содержимое iframe, если iframe инициирует любые операции сценариев до того, как родительское дерево DOM будет готово. Я заметил, что блокировка не возникает, если ресурс, загруженный iframe, не содержит скриптов. Я также заметил, что иногда IE не будет блокировать контент сценариями, но это, вероятно, связано с условием гонки между родительским DOM, который готов и загрузка ресурса iframe.
Еще одно замечание: я не видел проблем с загрузкой iframe при запуске IE в режиме edge. Похоже, проблема возникает только при работе в режиме совместимости.
Чтобы обойти проблему для проекта, над которым я работаю, я удалил iframe, где я не объявляю значение для атрибута src. На главной странице onload-обработчик - который указывает, что дерево DOM готово - я использую javascript для установки атрибута src iframe. Выполнение этого, похоже, будет работать, когда iframe будет правильно загружен.
Например, скажем, у вас есть следующее:
<iframe id="myIFrame"></iframe>
В вашем обработчике onload у вас есть что-то вроде:
document.getElementById('myIFrame').src = '/whatever/url/to/load';
Я все еще думаю, что KB3154070 представил ошибку регрессии (если не ошибки), но, возможно, то, что я предложил, может быть применено к вашему приложению.
UPDATE
Обновление IE KB317016 устраняет проблему загрузки iframe. Microsoft официально признала ошибку: KB3176757.
Я планирую сохранить свои изменения, так как некоторые из наших клиентов могут не иметь возможности мгновенно обновлять IE. Кроме того, изменения все еще работают во всех версиях IE, которые нам необходимо поддерживать.
Ответ 2
Мы столкнулись с одной и той же проблемой. Проблема в нашем конкретном случае заключалась в том, что iframe теперь прерывают свои запросы, когда они повторно запатентованы (т.е. Перемещены из одного дерева дерева DOM в другое). Мы смогли обойти новое ограничение, избегая перемещения iframe во время загрузки. Я не могу быть уверен, что именно то, что происходит в вашем случае, но я бы сказал, что это было какое-то взаимодействие между началом загрузки iframe и его завершением.
Ответ 3
В этой проблеме сильно повлияло мое прежнее программное обеспечение моей компании. Мы разработали следующее общее решение, пока Microsoft не решит эту ошибку:
$(document).ready(function() {
loadIframesIE();
});
function loadIframesIE() {
var $iframe;
$('iframe').each(function(cnt, iframe) {
$iframe = $(iframe);
// If the iframe body has no child, it couldn't be loaded
if ($iframe.contents().find('body').children().length === 0 && !$iframe.attr('resetted')) {
// Necessary to avoid an infinite loop in some cases
$iframe.attr('resetted', true);
$iframe.attr('src', $iframe.attr('src'));
}
});
}
Ответ 4
Проблема была исправлена в моем случае, установив заголовок совместимости в Edge. С KB3154070 он не работает для режимов документов 7 и 8, но работает для 9, 10 и Edge.
Кроме того, предложение @ewh для установки src после загрузки документа работало нормально. Спасибо.