Мы нашли то же самое, однако в итоге у нашего решения были списки меньшего размера!
Когда я посмотрел на это, это была комбинация нескольких вещей:
1) Содержимое поля списка очищается и перестраивается каждый раз, когда поле списка отображается (или пользователь что-то вводит и начинает фильтровать список).Я думаю, что это в основном неизбежно и довольно важно для работы со списком (так как вам нужно удалить элементы из списка, чтобы фильтрация работала).
Вы можете попробовать изменить его так, чтобы он отображал и скрывал элементы в списке, а не полностью восстанавливать его снова, но это будет зависеть от того, как составлен ваш список.
Альтернативапопытаться оптимизировать очистку / построение списка (см. 2. и 3.).
2) При очистке списка происходит существенная задержка.Моя теория состоит в том, что это, по крайней мере, сторона, потому что каждый элемент списка имеет присоединенные данные (с помощью функции data()
jQuery) - я, кажется, помню, что удаление данных, прикрепленных к каждому элементу, существенно ускорило этот шаг.
Возможно, вы захотите изучить более эффективные способы удаления дочерних html-элементов, например, Как сделать jQuery.empty более чем в 10 раз быстрее .Будьте осторожны с возможными утечками памяти, если вы играете с альтернативными функциями empty
.
В качестве альтернативы вы можете попытаться настроить его так, чтобы данные не были прикреплены к каждому элементу.
3) Остальная задержка связана с созданием списка - точнее, список создается с использованием большой цепочки операторов jQuery, например:
$("#elm").append(
$("option").class("sel-option").html(value)
);
Это выглядит довольно, но это довольно неэффективный способ построения html - гораздо более быстрый способ состоит в том, чтобы создать html-строку самостоятельно, например:
$("#elm").html("<option class='sel-option'>" + value + "</option>");
См. Производительность строки: анализ для довольноуглубленная статья о наиболее эффективном способе объединения строк (что, по сути, и происходит).
Вот в чем проблема, но я, честно говоря, не знаю, каков наилучший способисправить это было бы - в конце мы сократили наш список предметов, чтобы это больше не было проблемой.
Обращаясь к пунктам 2) и 3), вы можете обнаружить, чтопроизводительность списка улучшается до приемлемого уровня, но если нет, вам нужно обратиться к 1) и попытаться найти альтернативу очистке и повторному построению списка каждый раз, когда он отображается.
Удивительно, но функция фильтрации списка (которая включала несколько довольно сложных регулярных выражений) очень мало повлияла на производительность раскрывающегося списка - вам следует убедиться, что вы не сделали что-то глупое, но для нас это не было производительностью.bottlekneck.