IE8 - как запустить код jquery после загрузки содержимого?

У меня есть ситуация, когда я загружаю родительскую веб-страницу (это Java JSP), у которой есть контент, который я загружаю, используя ajax (asynch) внутри функции готовности документа, ожидая, что страница будет отображать все, что она может быстро запустить jquery для выполнения асинхронной работы после отображения страницы.

Он работает так, как ожидалось, в firefox - страница отображается быстро, а затем код jquery запускает аякс-вызовы, загружая другие элементы.

В IE8 он ждет, пока все будет сделано, а затем выполнит завершенные результаты. Это не подтверждает мою готовую попытку документа. Он сидит там, загружая страницу во время запуска моего кода в разделе готовности документа, а затем, наконец, завершенные результаты всего набросились на браузер.

Есть ли способ обхода? Любой способ заставить IE8 вести себя как Firefox в этом отношении... показать страницу ASAP, а затем запустить некоторые вызовы jquery code/ajax ПОСЛЕ рендеринга?

Ответ 1

Это ошибка, которая влияет на IE6 7 и 8. jQuery document ready handler не запускается до начала или сразу после события загрузки окна в IE 6 7 и 8. Этого не происходит в IE9.

Один из способов исправить это - обработать событие самостоятельно.

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

а затем в script используйте это:

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

Вы пробовали переместить свой раздел в конец страницы?