Время цикла Javascript для клонирования thead

Я попытался создать фиксированный thead, клонирующий thead из другой таблицы. Чтобы создать все td с такой же шириной, как у оригиналов, я зацикливаю каждый td и копирую ширину. Я хочу иметь лучшую производительность, потому что в таблице может быть много строк (> 10000). Я считаю, что время, затрачиваемое на цикл, зависит от строк в исходной таблице; например, со 100 строками требуется 10 мс, чтобы зациклить 9 столбцов, а 15000 строк - 350 мс ... почему ??? Я повторяю только thead исходной таблицы, и он всегда имеет 1 строку и фиксированное количество столбцов ...

Код:

var originTbl = document.querySelector("div.origin table.mytable");
var originTbl_Head = originTbl.querySelector("thead");
var cloneTbl = document.querySelector("div.cloned table.mytable");
var clone = originTbl_Head.cloneNode(true);
cloneTbl.appendChild(clone);
originTbl_Head.style.visibility = 'hidden';
var tds = cloneTbl.querySelectorAll('thead tr:first-child td');
var originTbl_Thead_Tr = originTbl.querySelectorAll("thead tr");
var td_list = originTbl_Thead_Tr[0].querySelectorAll('td');

console.time("loop");
for(i = 0; i < tds.length; i++) {
    var td = td_list[i];
    var width = td.clientWidth;
    tds[i].style.width = width + 'px';
}
console.timeEnd('loop');

Итак ... "обработка большего количества строк занимает больше времени"? Мне кажется правильным ... (время обработки включает макет / рендеринг в браузере)

user2864740 18.10.2018 07:31

чего именно ты хочешь добиться?

brk 18.10.2018 07:33

Когда вы устанавливаете и читаете clientWidth в цикле, вы заставляете пересчитывать значения рендеринга всей таблицы на каждом раунде итерации. Это означает, что ширина каждого td в таблице в конечном итоге вычисляется, и это занимает больше времени при вычислении большего количества строк.

Teemu 18.10.2018 08:18

См. макетирование для дальнейших объяснений.

Teemu 18.10.2018 08:29

Если вы назначили ширину оригинального <td>, клонированные копии указанных оригиналов будут иметь одинаковую ширину, поэтому цикл не нужен.

zer00ne 18.10.2018 09:14

@Teemu Спасибо! Я читаю статью, но не понимаю, почему, если я читаю только первую строку thead, она пересчитывает всю исходную таблицу, включая тело

Nixiam 18.10.2018 13:48

Это зависит от элемента, от CSS и встроенных стилей, от реализации и кто знает от чего, но если ширина не определена, самая широкая ячейка в столбце определяет ширину, поэтому вся таблица должна быть повторяется. Кроме того, семантически правильно использовать элементы TH в THEAD вместо TD. Также это скорее теоретический вопрос, дополнительное время удивительно мало, учитывая разницу в размерах столов.

Teemu 18.10.2018 13:51

Есть несколько интересных статей о вычислении ширины столбцов в Рекомендации W3C. Похоже, здесь происходит мой комментарий "каждый td в таблице в конечном итоге вычисляется".

Teemu 01.11.2018 18:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
114
1

Ответы 1

why? Потому что когда ты это делаешь var originTbl = document.querySelector("div.origin table.mytable"); Ему нужно отследить весь дочерний элемент до самого глубокого дочернего элемента. Это объясняет, почему вы можете использовать originTbl.querySelector("thead");.

Чтобы улучшить его, добавьте атрибут id к элементу thead и запросите идентификатор напрямую с помощью document.getElementById.

Да ладно, извините ... спасибо, что заметили ... скоро я улучшу свой ответ

Nikko Khresna 18.10.2018 08:18

Другие вопросы по теме