2016-03-06 6 views
0

Я пытаюсь создать список выбора html с 10 000 опциями. Из-за числа мне нужно, чтобы он был настолько эффективным, насколько это возможно. Я получил это работает, но я думаю, что это довольно неэффективныйJavaScript - Есть ли более эффективный способ создания элементов элементов?

var select = document.createElement("select"); 
document.body.appendChild(select); 

for (var i = 1; i <= 10000; i++) { 
    var option = document.createElement("option"); 
    var optionText = option.createTextNode("option" + i); 
    option.value = "option" + i; 
    option.appendChild(optionText); 
    select.appendChild(option); 
} 

Я читал, что запрашивая DOM слишком много может быть дорогим. Есть ли более простой способ сделать это?

+3

дорогостоящая вещь многократно чтение из DOM с последующим изменением DOM. Просто изменение DOM само по себе не так дорого. Однако со стороны UX ваши пользователи будут * ненавидеть * вас, если вы дадите им выбор из 10000 элементов. С * страстью *. В ваших ботинках я бы постарался * очень * придумать альтернативное решение для пользовательского интерфейса. – Amadan

+0

Обратите внимание, что было бы лучше добавить 'select' в конце, как только у него будет все' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' – Oriol

ответ

2

Я хотел бы посмотреть на этот вопрос с другой стороны. Как пользователь, я могу, возможно, переносить даже две секунды генерации этого списка (скорее всего, это займет менее 2 секунд даже на плохом телефоне), но заставляя меня выбирать элемент из выпадающего списка из 10 тыс. Элементов - это overkill.

Я бы полностью отказался от «создания опции» и будет исследовать лучший (с точки зрения точки зрения) подход. Что-то вроде select autocomplete (это только пример).

P.S. Если вы действительно хотите, чтобы ваши пользователи пострадали, прокрутив 10k элементов, я бы предложил взять эту часть select.appendChild(option); из цикла. Создайте все, что вы хотите добавить и добавить сразу.

+0

Спасибо, что указали это. Есть ли ограничение UX на количество параметров, которые вы можете показать? Будет ли 1000 еще слишком много? 100? Что делать, если вам нужно сохранить список городов в раскрывающемся списке – user5680735

+0

Нет жесткого ограничения, что означает, что вы не можете сказать, что 145 слишком много, но 140 в порядке. Это, в основном, то, какой конкретный человек может терпеть. Я бы сказал (но я не эксперт по пользовательскому интерфейсу), что если список прокрутки больше 3/4 экрана - это слишком много. Если вам нужен список городов, я бы вначале попросил человека выбрать страну (было бы глупо выбирать Египетский Мемфис, если вы хотите поехать в Мемфис в США). Тогда я бы позволил людям вводить начало и автозаполнять другие вещи для них. –

1

Вы можете использовать Option constructor:

Конструктор предназначен для создания HTMLOptionElement объектов (в дополнение к методам фабричных из DOM, такие как createElement()):

Option(text, value, defaultSelected, selected)

При вызове в качестве конструктор, он должен вернуть новый объект HTMLOptionElement (новый элемент option).

Если первый аргумент не пустая строка, новый объект должен иметь в качестве своего единственного ребенка в Text узел, данные которого значение , что аргумент. В противном случае у него не должно быть детей.

Если value аргумент присутствует, то новый объект должен иметь атрибут value набор со значением аргумента в качестве его значения.

Если аргумент defaultSelected верен, новый объект должен иметь атрибут selected без значения.

Если аргумент selected верен, новый объект должен иметь свой номер selectedness, равный true; в противном случае значение selectedness должно быть установлено на значение false, даже если аргумент defaultSelected является истинным.

В вашем случае,

select.appendChild(new Option("option" + i));