Очень медленное переформатирование/макет в Internet Explorer

Мне нужно динамически построить таблицу с +450 строками/+90 столбцами и показать ее в Internet Explorer. Последние два дня я сильно оптимизировал и в итоге создал набор строк таблицы в виде очень длинной строки и присвоил ее innerHTML tBody таблицы.

он отлично работает в Chrome/Mozilla, перекомпоновка занимает около 0,2 секунды, но очень медленно в Internet Explorer. рендеринг занимает около 4 секунд (я говорю «примерно», потому что, если консоль открыта (для измерения времени), рендеринг занимает 19 секунд). Другая проблема заключается в том, что innerHTML даже не поддерживается в IE9 и ниже. Итак, возникает вопрос: какой самый быстрый способ отрисовать весь HTML-код как можно быстрее в IE9?
Пример HTML:

<tr class="data-row" ><td class="hidden" style="width: -21px; padding: 
10px;">"1"</td><tdclass="structureCatagory" style="width: 119px; padding: 
10px;">"0381"</td><td class="structureCatagory" style="width: 139px; 
padding: 10px;">"Some text"</td><td class="structureCatagory" 
style="width: 139px; padding: 0px;"><img src="/Content/Images/info.png" 
onclick="Interface.OnImageClicked($(this))" ></td>...

И так далее до 4178521 символа.
Javascript:

function Update() {
    var displayData = Model.GetData();
    if (displayData == undefined || displayData.length == 0)
        return false;
    var rows = "", len = displayData.length;
    for (var i = 0; i < len; i++) rows += GetRow(displayData[i]);
    //until here it's very fast
    GlobalQueries.dataTableBody[0].innerHTML = rows;
    //^ this line takes alot of time
    return true;
}

Заранее спасибо!
Редактировать: Сама таблица:

<div class="grid">
    <table class="fixed">
        <tbody></tbody>
    </table>
</div>
<style>
    .grid { margin-top: 240px; margin-left: 10px; }
    .grid td, .header-row td { border: 1px solid black; }
    table.fixed { table-layout: fixed; }
</style>

person H. Saleh    schedule 31.05.2017    source источник
comment
Вы пытались а) начать с пустой таблицы б) назначить атрибуты/контент отдельным <td>?   -  person Chris G    schedule 31.05.2017
comment
Вы можете попробовать фиксированный макет таблицы, я думаю, что обычно он будет ждать загрузки всей таблицы перед рендерингом, где, как и в случае с фиксированным макетом, он будет отображаться по мере загрузки, кроме этого я бы предложил использовать плагин, чтобы вы могли разбить его на страницы как никто хочет увидеть таблицу с 450 строками и 90 столбцами!   -  person Pete    schedule 31.05.2017
comment
@ChrisG, назначение каждого отдельного атрибута за раз, вероятно, займет в 43 338 раз больше времени, поскольку каждый раз придется перекомпоновывать. @Pete Это уже исправлено. Я предполагаю, что он уже отображает все сразу, поскольку единственный контакт с DOM находится в GlobalQueries.dataTableBody[0].innerHTML = rows   -  person H. Saleh    schedule 31.05.2017
comment
it takes about 4 seconds to render ... for a total of 4178521 characters позвольте мне повторить это: IE needs almost 4 seconds to parse and render a 4MB html-file. И вторая небольшая подсказка: то, что вы не видите элемент, не означает, что браузер не должен отображать его при каждой прокрутке; 450000+ узлов DOM отображаются при каждом прокрутке. Может быть, это за кадром, может быть, это перекрывается чем-то. в противном случае, возможно, изменено положение ... браузер знает только то, что видно из узла и где на экране, после рендеринга узла.   -  person Thomas    schedule 31.05.2017
comment
Извините, я пару раз употребил не те слова... мой английский еще не идеален. После тестирования во всех трех браузерах я понял это так: сначала все происходит (загрузка страницы, выполнение js, построение длинной строки из 4178521 символа) довольно плавно менее чем за секунду. Затем идет часть GlobalQueries.dataTableBody[0].innerHTML = rows. Теперь его нужно разобрать: это занимает 200 миллисекунд в chrome/mozilla и 4 секунды в Internet Explorer. Рендеринг, о котором вы говорите (при каждой прокрутке), происходит после этого и происходит очень плавно во всех трех браузерах. Проблемы--   -  person H. Saleh    schedule 31.05.2017
comment
--что во-первых: IE занимает в 8 раз больше времени для анализа одного и того же HTML (и этот анализ происходит довольно часто, поскольку вы хотите отфильтровать/сортировать строки), а во-вторых, innerHTML не поддерживается в IE9, и там определенно много другие способы я просто ищу самый быстрый способ. Спасибо за ответ, и извините, если я что-то не так понял!   -  person H. Saleh    schedule 31.05.2017
comment
Единственное, что приходит на ум, это самостоятельно обрабатывать прокрутку и отображать только те строки, которые действительно видны.   -  person Chris G    schedule 31.05.2017
comment
Итак, в вашем случае узким местом является синтаксический анализ, а не рендеринг, хорошо. Часто бывает наоборот. Мой первый комментарий был не о вашей грамматике, а о попытке сделать акцент на том факте, что вы говорите о синтаксическом анализе четырех чертовых МБ HTML-разметки. И нет необходимости делать это более одного раза, если ваши данные не меняются, но не для сортировки или фильтрации; здесь вы просто переместите несколько DOM-узлов.   -  person Thomas    schedule 31.05.2017
comment
Самостоятельная обработка прокрутки, безусловно, вариант, но это действительно проблематично и требует времени, чтобы все выглядело хорошо без внезапных прыжков, прокрутки и всего остального. @Thomas Моя ошибка была не в грамматике, а в использовании слова «рендеринг» вместо «анализ». Также действительно хорошее предложение, но я не могу придумать способ сделать это без необходимости перекомпоновки каждый раз, когда я удаляю/добавляю элемент для фильтрации или переключения двух элементов для сортировки (теперь у меня есть случай синтаксического анализа и перекомпоновки... Я попробую ваше предложение и вернусь. Спасибо за ответы!)   -  person H. Saleh    schedule 01.06.2017


Ответы (1)


Думаю, здесь вам поможет только ленивый рендеринг. Таким образом вы уменьшите количество узлов HTML на странице и сделаете ее легче. Вам не нужно отображать строки, которые не видны на экране...

Есть примеры с jQuery, React, Polymer… и так далее.

Чтобы рисование выглядело быстрее, вы можете группировать вставки и не вставлять всю таблицу сразу, а кусками с такими методами, как requestAnimationFrame.

person Martin Chaov    schedule 31.05.2017
comment
Я попробую это, спасибо за ответ. Но еще одна вещь: я больше не могу использовать innerHTML, так как он не работает с tBody в IE9 и, конечно, для ленивой загрузки. вопрос: каков самый быстрый способ добавить HTML в этом случае? Является ли jQuery .append() опцией? есть ли нативный js, который быстрее? Спасибо за ответ! - person H. Saleh; 01.06.2017
comment
Ленивая загрузка с .empty().append() вместо .innerHTML сработала, спасибо! - person H. Saleh; 01.06.2017
comment
Да есть -> Element.insertAdjacentHTML() - person Martin Chaov; 02.06.2017