Задержка обновления DOM в IE6 с использованием jQuery - PullRequest
0 голосов
/ 30 июня 2009

Я борюсь с нелепой проблемой в IE6. Я визуализирую страницу, полную данных на стороне сервера, а затем перебираю результаты (строки таблицы HTML) на стороне клиента, обновляя каждую строку последовательно с результатами вызова AJAX для каждой строки. (Я не хочу использовать .each (), не спрашивай ...)

IE6 не будет показывать что-либо на стороне клиента, пока весь код в блоке document.ready () не завершится. В приведенном ниже коде вы увидите, что это воспроизводимо без вызовов AJAX db: возьмите таблицу из 100 строк, а когда документ будет готов, переберите коллекцию TR и замените текстовый узел в каждом TD. IE6 не покажет ничего, пока не завершится выполнение кода jQuery.

Вот контрольный пример:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<head>
<script src="scripts/jquery-1.3.2.min.js" type="text/javascript"></script>
<script type="text/javascript">
    $(document).ready( function() {     
        var totalRows = $('table tr').size();
        for (var i=0; i<totalRows; i++) {
            var currentRow=$('table tr').eq(i);
            var cellTarget = currentRow.children(0);
            cellTarget.html('and after');
            }

});
</script>
</head>
<body>
<table>
<tr><td>before</td></tr>
<tr><td>before</td></tr>
<tr><td>before</td></tr>
... repeat 97 more times ...
</table>
</body>
</html>

Вот сумасшедшая часть: положить оповещение («привет»); после обновления текстового узла TD и когда появляется окно модального оповещения, вы можете наблюдать за обновленной таблицей, которая обновляется, когда она проходит по строке. Я пытался использовать различные функции сна после обновления текстового узла, но безрезультатно - похоже, что это не имеет никакого эффекта, кроме замедления общего времени выполнения. Я пытался переместить блоки скриптов в конец файла, но это, похоже, тоже не решает проблему.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 30 июня 2009

У меня нет экземпляра IE6 для тестирования прямо сейчас, но что, если вы использовали функцию .each в jQuery?

Фрагмент JS сводится к следующему:

$(document).ready( function() {
    $('table tr').each(function(i){
        // In this function, 'this' is bound to your table row
        // The argument i receives the same value as your original loop, 
        // although it's not necessary in this style.
        // Also, 'this' is actually bound to the DOM element, 
        // NOT a jQuery object, so if you want to use jQuery stuff,
        // you gotta $(wrap) it.
        $(this).html('and after');
        // Alternately, you could just this.innerHTML = 'and after';
    });
});

Я также разместил его на JS Bin, вы можете просмотреть его вживую на http://jsbin.com/aguxa или отредактировать на http://jsbin.com/aguxa/edit - любые изменения, которые вы сделаете и сохраните, не изменят оригинал, так что подправьте (например, добавив в это предупреждение, которое я не испытываю, пробуя 100 строк таблицы;))

0 голосов
/ 30 июня 2009

Вы пытались сохранить функцию сверху, но держите ее вне $ (document) .ready () и установите ее как свою собственную функцию. А затем в нижней части документа поместите тег сценария, который вызывает эту функцию?

Также еще одна возможность - поместить defer = "true" в тег скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...