У меня была очень похожая ситуация.
У меня есть набор входов с 1700+, поэтому я предоставил опцию «фильтр», которая копировала бы выбор и применяла фильтр на основе помимо скопированного списка.(Он «открывает» диалоговое окно, которое расширяет раскрывающийся список до списка, занимающего почти 80% экрана)
Незаметно копирование сработало в других браузерах, но в IE заняло 8-15 секунд.
Решение, основанное на предыдущих ответах, а также на этом посте ( Узнайте о медленном (и быстром) способе добавления элементов в DOM ) заключалось в добавлении всех элементов вСтрока HTL, затем присваивает ее внутреннему HTML нового объекта, который еще не является частью DOM.И, наконец, замена объекта из DOM на новый.
Это, очевидно, уменьшает количество операций «перекомпоновки», выполняемых браузером, что, скорее всего, является причиной такой низкой производительности.
Некоторым тестом до реализации этого стиля было выполнение полного цикла for без добавления параметров в список, и в таком тесте код выполнялся очень быстро, было ясно, что selectElement.add (optionElement) был медленнымpart.
Вот пример того, как закончилась моя функция:
function fillselector(IdSelect){
var selector = document.getElementById(IdSelect);
if( !selector ){
alert('Original select element not found.');
return;
}
var lista = document.getElementById('selectFilter_lista');
if( !lista ){
alert('Copied list element not found.');
return;
}
var filterText = noSpecialChars(document.getElementById('selectFilter_text').value);
var options =''
for (var i = 0; i < selector.length; i++){
if (filterText == '' || noSpecialChars(selector[i].text).indexOf(filterText) != -1 ){
//Commented code works but is painfuly slow on IE
//var option = document.createElement("option");
//option.value = selector[i].value;
//option.text = selector[i].text;
//lista.add(option);
options += '<option value="'+selector[i].value+'">'+selector[i].text+'</option>';
}
}
var newList = document.createElement('select');
newList.id='selectFilter_list';
newList.className='selectFilter_list';
newList.size = 20;
newList.ondblclick= function(){closeselector(IdSelect, true);}
newList.innerHTML = options;
newList.value = selector.value;
var listParent = lista.parentElement; //<div> that only contains the <select>
listParent.removeChild(lista);
listParent.appendChild(newList);
}