В таких ситуациях есть удобный трюк: используйте setTimeout с 0 миллисекундами.Это заставит ваш JavaScript уступать браузеру (чтобы он мог выполнять рендеринг, реагировать на ввод пользователя и т. Д.), Но не заставляя его ждать определенное время:
for (i=0;i<data.length;i++) {
tmpContainer += '<div> '+data[i]+' </div>';
if (i % 50 == 0 || i == data.length - 1) {
(function (html) { // Create closure to preserve value of tmpContainer
setTimeout(function () {
// Add to document using html, rather than tmpContainer
}, 0); // 0 milliseconds
})(tmpContainer);
tmpContainer = ""; // "flush" the buffer
}
}
Примечание : TJ Crowder правильно упоминает ниже, что приведенный выше код будет создавать ненужные функции на каждой итерации цикла (одна для настройки закрытия, а другая в качестве аргумента для setTimeout
).Это вряд ли проблема, но если вы хотите, вы можете проверить его альтернативу , которая создает функцию закрытия только один раз.
Слово предупреждения: даже если приведенный выше код будетобеспечить более приятный опыт рендеринга, не рекомендуется иметь 10000 тегов на странице.После этого все другие манипуляции с DOM будут выполняться медленнее, потому что есть еще много элементов, через которые нужно пройти, и намного более дорогой расчет перекомпоновки для любых изменений в макете.