Шаблон для загрузки большого количества script фрагментов в готовом событии DOM без IE 8, отображающего предупреждение о времени ожидания script

77
7

Я работаю над интерфейсом с большим количеством JavaScript - все небольшие, самодостаточные фрагменты кода, предназначенные для выполнения различных действий на интерфейсе.


Все фрагменты (или блоки функциональности, если они есть) помещаются внутри одной и той же области; событие готовности DOM. Это значит, что различные фрагменты могут совместно использовать несколько глобальных переменных.


Вот как он структурирован...


$(function ()
{
var SCOPED_GLOBAL_1;
var SCOPED_GLOBAL_2;
// Etc.

// A snippet of code designed to enable X functionality

// Another snippet of code designed to enable Y functionality

// Etc.
});


Используя этот подход, я получаю страшный всплывающий тайм-аут script из-за большого количества выполняемого кода.


Internet Explorer 8 определяет script тайм-аут в зависимости от того, сколько звонков сделано... И выполняется много звонков... Много!




Я провел некоторое тестирование, и, насколько я могу судить, единственный способ избежать всплывающего окна - использовать setTimeout и постепенно выполнять куски кода.


Я попытался разбить код на несколько вызовов на событие готовности DOM, но кажется, что Internet Explorer 8 интерпретирует эти вызовы, как если бы они были одним вызовом. (Такая же подпись при профилировании).




Код будет беспорядочным, если мне нужно реализовать подход setTimeout. И совместное использование глобальных областей не будет легким.


У вас есть образец, который поможет мне?




Обновление


Как некоторые из вас предложили, оптимизация кода была бы способом справиться с этим. Я уверен, что в коде есть место для оптимизации, но, как я вижу; это просто основная часть кода, что проблема здесь, а не то, как она работает.


Выполняется много предварительно настроенного кода, который инициализирует различные компоненты пользовательского интерфейса. Именно этот код вызывает проблемы в Internet Explorer 8... благодаря большому количеству звонков. Не сколько времени требуется для выполнения кода.


Код работает быстро и отлично во всех других браузерах, беря в среднем полторы секунды, чтобы загрузить (что быстро, по сравнению с тем, как много вещей происходит). Проблема в том, что Internet Explorer 8 определяет script как медленный, по количеству выполненных вызовов, в то время как все другие браузеры (и IE 9, по-видимому) определяют тайм-аут к моменту, когда он выполняет код.

спросил(а) 2021-01-27T16:39:03+03:00 4 месяца, 3 недели назад
1
Решение
133

За исключением рефакторинга setTimeout, вероятно, самый простой трюк в книге. Это также не должно быть грязным:


$(function () {
var SCOPED_GLOBAL_1, SCOPED_GLOBAL_2;

// Add code in blocks
var codeBlocks = [];
codeBlocks.push(function () {
// A snippet of code
});
codeBlocks.push(function () {
// Another snippet of code
});

// Execute code in blocks
while (codeBlocks.length) {
(function (func) {
setTimeout(func, 0);
})(codeBlocks.shift());
}
});

Это по существу создает очередь для любого количества блоков кода для выполнения и выполняет их индивидуально, в порядке, с setTimeout().

ответил(а) 2021-01-27T16:39:03+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема