Как динамически обновить окно выбора HTML в IE

У меня есть HTML-элемент «select», который я динамически обновляю примерно таким кодом:

var selector = document.getElementById('selectorId');    
for (var i = 0; i < data.length; ++i)
{
  var opt = document.createElement('option');
  opt.value = data[i].id;
  opt.text = data[i].name;
  selector.appendChild(opt);
}

Прекрасно работает в Firefox, но IE7 не изменяет размер окна списка в соответствии с новыми данными. Если поле со списком изначально пусто (как в моем случае), вы вряд ли увидите какие-либо из добавленных мною параметров. Есть лучший способ сделать это? Или способ исправить это для работы в IE?

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
0
17 562
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Вы можете попробовать заменить весь элемент select из сгенерированного html-кода или в качестве взлома удалить элемент из DOM и прочитать его.

Ответ принят как подходящий

Установите свойство innerHTML объектов параметров вместо их text.

var selector = document.getElementById('selectorId');    
for (var i = 0; i < data.length; ++i)
{
  var opt       = document.createElement('option');
  opt.value     = data[i].id;
  opt.innerHTML = data[i].name;
  selector.appendChild(opt);
}

Работает на IE6, только что протестировал. Не ломается на FF3, так что думаю вот оно.

(Я выбрал «innerHTML», потому что это работает во всех браузерах. Чтобы установить буквальный текст, вы должны использовать «innerText» в IE и «textContent» в FF, и вам, вероятно, придется протестировать его в другом месте. в свойствах "name" нет специальных символов (&, <,>), "innerHTML" будет достаточно.)

opt.text - стандартное свойство, поддерживаемое каждым браузером JavaScript вплоть до Netscape somethingancient.0, и не имеет проблем со специальными символами. innerHTML - это нестандартное расширение IE, хотя его используют все современные браузеры. Я не понимаю, почему это действительно победа.

bobince 04.11.2008 14:22

Попробуйте и почувствуйте разницу. Стандартный или нет, он работает в основных браузерах и решает конкретную проблему. Я указал, что вы тоже можете сделать это по-другому.

Tomalak 04.11.2008 15:16

Кстати о стандартах: я видел, как люди делали (и рекомендовали) невероятно безумные вещи, чтобы обойти тот факт, что атрибут целевой ссылки не соответствует стандарту. Он не сделал их код лучше, он просто сделал его «действительным» для парсера SGML. Ура.

Tomalak 04.11.2008 16:11

Для этого не нужно манипулировать DOM. Попробуйте вместо этого

var selector = document.getElementById('selectorId');  
for (var i = 0; i < data.length; ++i) {
    selector.options[selector.options.length] = new Option(data[i].name, data[i].id);
}

Как этот нет манипулирует DOM? :-) Но должен признать, работает безотказно. +1

Tomalak 04.11.2008 15:26

Я имею в виду document.createElement (который создает произвольные элементы), который вы позже вставляете в DOM (appendChild). В любом случае, есть разные подходы, которые работают для этой конкретной проблемы.

Marko Dumic 10.11.2008 23:06

Установите ширину поля выбора явно, используя, например,. стиль CSS «ширина», вместо того, чтобы позволить браузеру угадывать ширину по его содержимому.

После добавления элемента option принудительно установите select.style.width на auto, даже если это уже auto.

Если это не сработает, очистите select.style.width до "", а затем снова восстановите select.style.width на auto.

Это заставляет Internet Explorer пересчитывать оптимальную ширину элементов select.

Другие вопросы по теме