我们有一个主要处理iframe的应用程序(根据需要加载应用程序中的不同页面)
最近,作为系统更新的一部分,IE浏览器更新了KB3154070(当前IE版本:11.0.9600.18314)。更新后,大部分功能完全破坏。它影响了所有使用iframe的页面。内容未加载并导致空白页面。在网络面板中检查时,请求似乎已中止,如下面的屏幕截图所示。 Network Traffic Capture
我们已执行以下问题排查
我们确保所有iframe代码都正确关闭。 iframe的src不为空。 如果我们访问外面的同一页面(没有加载到iframe),它工作正常。但是,问题仅在于iframe内部。 作为此问题的快速解决方法,我们已要求用户回滚更新。但是,这不是预期的解决方案。
非常感谢您的帮助。
此致 Swajay。
答案 0 :(得分:10)
@Matt的回答提供了如何解决问题的线索。如果iframe在父DOM树准备好之前启动任何脚本操作,那么安装了KB3154070的IE似乎会阻止iframe内容。我注意到,如果iframe加载的资源不包含脚本,则不会发生阻塞。我还注意到有时IE不会使用脚本来阻止内容,但这可能是由于父DOM准备就绪和iframe资源加载之间的竞争条件。
另一个观察是我在边缘模式下运行IE时没有看到任何iframe加载问题。只有在兼容模式下运行时才会出现此问题。
为了解决我正在处理的项目的问题,我对iframe进行了存根,在那里我没有为src属性声明任何值。在主页面的onload处理程序中 - 表示DOM树已准备就绪 - 我使用javascript来设置iframe的src属性。这样做似乎可以正常加载iframe。
例如,假设您有以下内容:
<iframe id="myIFrame"></iframe>
在你的onload处理程序中,你有类似的东西:
document.getElementById('myIFrame').src = '/whatever/url/to/load';
我仍然认为KB3154070引入了一个回归错误(如果不是错误),但也许我建议的可以应用于您的应用程序。
<强>更新强>
IE更新KB317016似乎可以解决iframe加载问题。 Microsoft已正式认识到该错误:KB3176757。
我计划保留我的更改,因为我们的一些客户可能无法立即更新IE。此外,所做的更改仍然适用于我们需要支持的所有IE版本。
答案 1 :(得分:4)
我们遇到了完全相同的问题。在我们的特定情况下的问题是iframe现在在它们被重新父级(即从一个DOM树位置移动到另一个DOM树位置)时中止它们的请求。我们能够通过避免在加载时移动iframe来解决新的限制。我无法确定你的情况究竟发生了什么,但我打赌这是在iframe加载开始和完成之间发生的一些交互。
答案 2 :(得分: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'));
}
});
}
答案 3 :(得分:2)
在我的情况下,通过将兼容性标头设置为Edge来解决此问题。对于KB3154070,它不适用于文档模式7和8,但适用于9,10和Edge。
另外,文件加载后设置src的@ewh建议正常。感谢。