IE8 - 如何在内容加载后运行 jquery 代码?

Posted

技术标签:

【中文标题】IE8 - 如何在内容加载后运行 jquery 代码?【英文标题】:IE8 - how to run jquery code after content loads? 【发布时间】:2012-10-22 13:10:22 【问题描述】:

我有一种情况,我加载了一个父网页(恰好是 Java JSP),该网页的内容是我在文档就绪函数中使用 ajax(异步)加载的,期望页面能够快速呈现任何内容,然后运行页面显示后执行异步工作的 jquery 代码。

它在 firefox 中按预期工作 - 页面快速呈现,然后 jquery 代码运行 ajax 调用加载其他元素。

在 IE8 中,它等到一切都完成,然后呈现完成的结果。它不尊重我的文档准备尝试。它坐在那里加载页面,同时在文档准备部分运行我的代码,然后最后所有完成的结果都被放在浏览器上。

有什么解决方法吗?有什么方法可以让 IE8 在这方面表现得像 Firefox……尽快渲染页面,然后在渲染后运行一些 jquery 代码/ajax 调用?

【问题讨论】:

可以确定 jQuery.document(ready) 是直接调用的,但请记住 AJAX 是异步的,您无法控制它何时返回。 【参考方案1】:

这是一个影响 IE6 7 和 8 的错误。jQuery 的文档就绪处理程序直到 IE 6 7 和 8 中的窗口加载事件之前或之后才会触发。这在 IE9 中不会发生。

解决它的一种方法是自己处理事件。

<body class="jquerydomready">
    <!--[if lt IE 9]>
    <script>
        $('body').removeClass('jquerydomready');
    </script>
    <![endif]-->

然后在你的脚本中使用这个:

function init() 
    // code here will be ran when document is ready
    $("body").css("background-color","green");


if ( $("body").is(".jquerydomready") ) 
    $(init); // not oldIE

else 
    // oldIE way
    document.onreadystatechange = function() 
        if (document.readyState == "interactive") init();    
    ​

请记住,如果您正在执行 ajax 请求并期望它们快速发生,否则代码将无法工作,我建议您转移到不需要它们快速发生的系统,因为您不能依赖网络总是很快。

票:http://bugs.jquery.com/ticket/12282

它目前实际上并没有被标记为一个错误,但是如果你关注这个问题的历史,它在整个 jQuery 的开发过程中已经被修复和未修复了好几次。

编辑:我不完全确定这个答案的 IE6 部分,我没有用这个测试过 IE6。

这是一个支持 JSFiddle,显示它在 IE7 和 8 中不正确地等待(同样未在 IE6 中测试)。

在上述修复之前:http://jsfiddle.net/PFWmS/

经过上述修复:http://jsfiddle.net/PFWmS/7

【讨论】:

优秀的帖子!感谢您为所有人提供此内容。【参考方案2】:

您是否尝试过将您的部分移至页面末尾?

【讨论】:

以上是关于IE8 - 如何在内容加载后运行 jquery 代码?的主要内容,如果未能解决你的问题,请参考以下文章

用jQuery替换内容会导致IE8中的内存泄漏吗?

加载页面中的所有图像后如何运行 jQuery 代码?

IE8中jQuery.load()加载页面不显示的原因

win7 IE8无法加载jquery的js问题?

使用 jQuery ColorBox 的 iFrame IE8

在每个组件完成加载后如何在 Angular 2 中运行 jquery 函数