Предотвращение тайм-аута сценария с большими селекторами jQuery
Для проекта, над которым я работаю, на странице есть несколько полей для редактирования расширенного текста, число которых варьируется, но может быть очень большим (более 50 наборов вопросов / ответов, каждое с 8 текстовыми полями).
Первоначально это были текстовые поля, которые принимали HTML, но из-за того, что конечный клиент, который будет использовать его, не владеет HTML, мы перешли на использование редактора richtext, поэтому оригиналы конвертируются с помощью плагина javascript richtext (NicEdit).
Из-за переменного количества этих полей ввода я использую селектор jQuery:
$("textarea").each(function(index) {
var id = this.id;
myNicEditor.addInstance(this);
$("#nic"+id).attr('contenteditable','false');
});
Тем не менее, когда общее количество редакторов превышает 200, я начинаю получать предупреждения о превышении времени ожидания сценария. На 400 я должен дважды нажать "продолжить", чтобы закончить.
Как бы я реструктурировал эту функцию, чтобы предотвратить тайм-ауты?
2 ответа
jQuery делает много вещей в селекторе, но найденные элементы не заключены в объекты jQuery. 200 не такой большой, но в любом случае есть 2 вещи, которые вы можете сделать:
- Найти все текстовые сообщения с помощью ванильного вызова JavaScript
- Обработать текстовые области в очереди событий через setTimeout
var els = document.getElementsByTagName("textarea")
var i = 0
var func = function() {
var el = els[i]
myNicEditor.addInstance(el);
$("#nic"+el.id).attr('contenteditable','false');
i++
setTimeout(func,0)
}
func()
400 полнофункциональных текстовых редакторов на веб-странице должны использовать массу ресурсов. Я думаю, что ваш лучший выбор - не пытаться разместить все это на одной странице. Попробуйте реорганизовать ваше приложение - возможно, разбейте его на более мелкие страницы или, при необходимости, загрузите подразделы страницы.
Или вы можете оставить текстовые поля как есть, а затем загружать только один расширенный редактор за раз по мере необходимости.