У меня есть таблица данных, которая генерируется динамически с помощью Javascript. Каждые несколько минут страница обновляет данные, запуская Ajax-запрос, возвращая данные с сервера и заменяя данные в таблице. Это довольно стандартно, и таблица в итоге выглядит так:
Это прекрасно работает, если я сгенерирую данные, опустошив таблицу и постепенно добавляя строки обратно. Однако эта таблица может содержать тысячи строк, и генерация таблицы, которую дает браузер, может занять очень много времени. пользователь «Этот сценарий занимает слишком много времени, чтобы выполнить» ошибки. Поэтому я исправил это, разбив генерацию таблицы на куски и выполнив немного по очереди, используя setInterval
.
Это сработало нормально, но, поскольку для полной генерации таблицы может потребоваться некоторое время, я попытался быть умным и выполнить некоторую псевдо-двойную буферизацию. У меня есть вторая таблица, для которой display
имеет значение none
, чтобы скрыть ее, и когда я заново генерирую таблицу, я добавляю строки в скрытую таблицу по очереди. Таким образом, существующие данные будут видны пользователю до тех пор, пока не будет завершена повторная генерация таблицы, после чего мы просто заменим их новым контентом сразу.
Я делаю замену следующей строкой кода
$("#loading_area tbody").children().appendTo( $("#unplanned tbody").empty() );
Это прекрасно работает в Firefox, Safari и Google Chrome. Но в IE я получаю следующее:
Эти строки на самом деле не пустые - содержимое есть, если я прокручиваю достаточно горизонтально:
Кажется, что первый столбец имеет ширину более 55 000 пикселей! И вот действительно странная часть: контент снова отображается правильно, как только я изменю НИЧЕГО в отношении стиля таблицы. Поэтому, если я поменяю цвет шрифта на зеленый, IE немедленно выполнит корректную визуализацию таблицы.
Но я не могу внести изменения напрямую. Так что, если я скажу
$("#unplanned").css("color", "green");
тогда он не рендерится должным образом; цвет меняется, но ширина первого столбца составляет 55 000 пикселей. Но если я внесу изменения непосредственно в таблицу стилей
document.styleSheets[1].rules[3].style.color = "green";
тогда он корректно отображает таблицу.
Итак, я решил исправить это, сделав случайное изменение стиля, переключая поле кнопки «Развернуть / Свернуть» между 1px
и 0px
, каждый раз, когда я заканчивал раскладывать таблицу, и это работало.
Моя проблема заключается в том, что при попытке распечатать страницу строки выглядят пустыми, поскольку содержимое страницы неправильно отображается на принтере.
Так что я попробую больше обмана, возможно, просто переключая отображаемую таблицу и меняя их id
или что-то еще, чтобы это работало. У меня вопрос, что здесь происходит? Это похоже на ошибку в IE; Я использую IE8, но то же самое происходит в IE6 и IE7. Я бы хотел избежать попадания в эту яму в будущем, но я не уверен, что является причиной этого, поэтому я не совсем уверен, чего мне следует избегать. Любой свет, который кто-либо может пролить на это, будет очень признателен.
РЕДАКТИРОВАТЬ: замена отображаемой таблицы устраняет проблему рендеринга в браузере, не требуя взлома таблицы стилей, но проблема с печатью все еще существует. На самом деле, проблема печати существует даже тогда, когда таблица генерируется напрямую, без каких-либо хитростей в отображении / скрытии или перемещении элементов. Так что я определенно запутался и не уверен, что я могу сделать, чтобы эта проблема исчезла. Возможно, мне придется сделать отдельную статическую страницу только для печати, если я не могу понять это.