加载大页面时 Internet Explorer 无响应

Posted

技术标签:

【中文标题】加载大页面时 Internet Explorer 无响应【英文标题】:Internet explore is unresponsive while loading a large page 【发布时间】:2011-02-11 10:43:40 【问题描述】:

我们在浏览器 (IE) 中呈现了一个 html 页面,导致浏览器挂起。该页面是通过服务器端脚本生成的(ASP.NET 和视图状态被禁用)。加载页面需要很长时间(它不是黑白问题,因为我们可以在本地机器上重现它)并且有时会导致脚本无响应错误。在调试问题时,我们发现客户端的 html 大小为 4.73 MB。在文档准备好(jquery-document.ready)之后还有很多 DOM 遍历(使用 JQuery)。加载之后,页面也会在任何用户交互(滚动、鼠标悬停)等情况下挂起。在加载期间和任何用户交互时都会看到 CPU 使用率峰值(25-50% 使用率)

【问题讨论】:

不是大文件,而是 javascript。你必须优化它,并理解它永远不会一样,但至少它会“发挥作用” 我不同意。两者肯定是相关的。文件越大,JS 处理 DOM 的时间就越长;仅仅是因为它有更多的节点要处理。 如果禁用 jquery 代码会怎样? 我可以理解在页面加载时 jquery dom 遍历可能会出现问题。但是即使页面完全加载并“准备好”,页面也会挂起。例如即使这些事件没有 dom 遍历,滚动甚至 document.click 也会导致页面挂起。 “完全加载并准备就绪”是什么意思。你的意思是页面在浏览器中是完全可见的吗?还是只是JS处理完成了?而且,为什么客户端的 HTML 数量如此之多? 【参考方案1】:

Internet Explorer 的 DOM 非常奇特。它非常脆弱。

我推荐以下内容: http://msdn.microsoft.com/en-us/library/ms533019(VS.85).aspx http://blog.dynatrace.com/2009/12/12/understanding-internet-explorer-rendering-behaviour/ http://blogs.msdn.com/ie/archive/2006/08/28/728654.aspx

最重要的是: http://www.quirksmode.org/dom/innerhtml.html

【讨论】:

【参考方案2】:

如果加载时的“脚本无响应”对话框有问题,至少在较旧的 IE 版本中可能会被欺骗。使用setTimeout 将您正在做的工作分成多个任务。这会导致 IE 无法跟踪使用了多少总执行时间。

您可以在后台工作进行时抛出某种“正在加载”的 div,这至少会带来更好的用户体验。

【讨论】:

【参考方案3】:

我首先要看的是客户端收到的超大 HTML 大小。 Internet Explorer 并不以快速处理大量 HTML 而闻名,尤其是当您在之后进行大量 DOM 遍历时。如此大的树的 DOM 处理解释了 CPU 峰值。

真的有必要向客户端发送这么大量的HTML吗?

【讨论】:

【参考方案4】:

这可能对您有所帮助,也可能无济于事,但我唯一一次看到 html 页面甚至远程接近该大小是当有人将大量数据写入 js 数组以进行查找时。

也许考虑将一些数据(如果可以很好地分区,甚至是 html)移动到 Web 服务/ajax 调用中?无论如何,查找通常会更有效率。

如果只是原始 html,请考虑对其进行分区,并仅在用户向下滚动/单击选项卡等时通过 ajax 加载下一部分。

【讨论】:

以上是关于加载大页面时 Internet Explorer 无响应的主要内容,如果未能解决你的问题,请参考以下文章

如何避免“Internet Explorer 想要跟踪您的物理位置”提示?

Internet Explorer 缓存 asp.net mvc ajax 结果

如何强制 Internet Explorer 以标准模式而不是 Quirks 模式呈现?

Internet Explorer 未加载 js 文件

我可以将整个 HTML 文档加载到 Internet Explorer 中的文档片段中吗?

如何从批处理文件中打开和关闭 Internet Explorer?