Получение выбранных значений в теге multiselect в Javascript

У меня есть следующий код

function searchFlights() {
    var select1 = document.getElementById("airports-select-1");
    var selected1 = [];
    while(select1.selectedIndex != -1) {
      if(select1.selectedIndex != 0) selected1.push(select1.options[select1.selectedIndex].value); 
      select1.options[select1.selectedIndex].selected = false;
   }

   console.log(selected1);
}

Это работает правильно, но как видно из кода этой строки:

select1.options[select1.selectedIndex].selected = false;

Выполняет отмену значения.

Теперь я не хочу отменять значения. Если я раскомментирую эту строку в коде, код будет работать вечно.

Есть ли еще более изысканное и сложное решение для извлечения нескольких значений из тега select с помощью Javascript?

Ответы

Ответ 1

Не будет ли это сделать это:

function searchFlights() {
    var select1 = document.getElementById("airports-select-1");
    var selected1 = [];
    for (var i = 0; i < select1.length; i++) {
        if (select1.options[i].selected) selected1.push(select1.options[i].value);
    }
    console.log(selected1);
}​

function searchFlights() {
    var select1 = document.getElementById("airports-select-1");
    var selected1 = [];
    for (var i = 0; i < select1.length; i++) {
        if (select1.options[i].selected) selected1.push(select1.options[i].value);
    }
    console.log(selected1);
}
<form method="post">
  <select name="Select1" multiple="multiple" size="8" id="airports-select-1" onblur="searchFlights()" ;>
    <option>aaa</option>
    <option>bbb</option>
    <option>ccc</option>
    <option>ddd</option>
    <option>eee</option>
  </select>
</form>

Ответ 2

Обновление для 2018 года:

  • Если элемент <select> содержит свойство selectedOptions, используйте эту коллекцию. Единственный браузер, все еще широко распространенный, который не поддерживает это, это IE (любая версия). Edge поддерживает это.

  • Если это не поддерживается, ответ @j08691 по-прежнему правильный, но в качестве оптимизации производительности вы можете начать итерацию параметров с selectedIndex вместо 0. Это индекс первой выбранной опции или -1 если ничего не выбрано.