Як отримати всі вибрані значення множинного вікна вибору?


77

У мене є <select>елемент з multipleатрибутом. Як я можу отримати вибрані значення цього елемента за допомогою JavaScript?

Ось що я намагаюся:

function loopSelected() { 
    var txtSelectedValuesObj = document.getElementById('txtSelectedValues');
    var selectedArray = new Array();
    var selObj = document.getElementById('slct'); 
    var i;
    var count = 0;
    for (i=0; i<selObj.options.length; i++) { 
        if (selObj.options[i].selected) {
            selectedArray[count] = selObj.options[i].value;
            count++; 
        } 
    } 
    txtSelectedValuesObj.value = selectedArray;
}

ви могли б заощадити багато часу на пошук половини свого заголовка в google ... google.com/…
neurino

У вас написаний код? З цим було б легко допомогти :)
Нобіта

Відповіді:


109

Немає jQuery:

// Return an array of the selected opion values
// select is an HTML select element
function getSelectValues(select) {
  var result = [];
  var options = select && select.options;
  var opt;

  for (var i=0, iLen=options.length; i<iLen; i++) {
    opt = options[i];

    if (opt.selected) {
      result.push(opt.value || opt.text);
    }
  }
  return result;
}

Швидкий приклад:

<select multiple>
  <option>opt 1 text
  <option value="opt 2 value">opt 2 text
</select>
<button onclick="
  var el = document.getElementsByTagName('select')[0];
  alert(getSelectValues(el));
">Show selected values</button>

1
Дякую за цю відповідь. Не могли б ви пройти це для мене? Здається, я розумію БОЛЬШІСТЬ цього, але що var options = select && select.options;робити За свого недосвідчення я очікував, що це будеvar options = select.options;
TecBrat

12
selectне найкраще ім'я змінної в JavaScript.
VisioN 05.03.14

4
@TecBrat var options = select && select.optionsгарантує, що вибір не є невизначеним, перед тим, як отримати доступ до його атрибутів.
Qwerty

Я не думаю, що рядок з && має багато сенсу ... якщо selectне визначено getElementById, повернеться null. У цьому випадку optionsпомилка буде помилкою при спробі отримати доступ до властивості length. Але може мені чогось не вистачає?
Xen_mar

33

ES6

[...select.options].filter(option => option.selected).map(option => option.value)

Де selectпосилання на <select>елемент.

Щоб розбити його:

  • [...select.options]бере Array-подібний список опцій і деструктурує його, щоб ми могли використовувати на ньому методи Array.prototype (Редагувати: також розглянути можливість використання Array.from())
  • filter(...) зменшує параметри лише до вибраних
  • map(...)перетворює вихідні <option>елементи у відповідні значення

4
Приємна функціональна реалізація :)
roadev

Ви можете використовувати метод просто зменшення () Моя реалізація
To_wave

Якщо ви можете отримати посилання на <select>, чому б не пропустити крок filter () і просто отримати посилання на: selected children of <select> using querySelectorAll?
Євген

1
@Evgeny багато способів її вирішити. Вам слід опублікувати свій підхід у новій відповіді.
Рік Віскомі,

1
@Anentropic - це хороше питання, але я не думаю, що ефективність має велике значення, якщо ми не говоримо про сотні чи тисячі варіантів.
Рік Віскомі,

28

Перевір:

HTML:

<a id="aSelect" href="#">Select</a>
<br />
<asp:ListBox ID="lstSelect" runat="server"  SelectionMode="Multiple" Width="100px">
    <asp:ListItem Text="Raj" Value="1"></asp:ListItem>
    <asp:ListItem Text="Karan" Value="2"></asp:ListItem>
    <asp:ListItem Text="Riya" Value="3"></asp:ListItem>
    <asp:ListItem Text="Aman" Value="4"></asp:ListItem>
    <asp:ListItem Text="Tom" Value="5"></asp:ListItem>
</asp:ListBox>

JQUERY:

$("#aSelect").click(function(){
    var selectedValues = [];    
    $("#lstSelect :selected").each(function(){
        selectedValues.push($(this).val()); 
    });
    alert(selectedValues);
    return false;
});

КЛАЦНУТИ ТУТ, ЩОБ ПОБАЧАТИ ДЕМО


1
Не фанат - "HTML" не є HTML (читається, але не HTML), і відповідь вимагає додавання JQuery як залежності.
Iiridayn

10

Приблизно те саме, що вже пропонувалось, але дещо інше. Приблизно стільки ж коду, скільки jQuery у Vanilla JS :

selected = Array.prototype.filter.apply(
  select.options, [
    function(o) {
      return o.selected;
    }
  ]
);

Це , здається, швидше , ніж цикл в IE, FF і Safari. Мені цікаво, що в Chrome та Opera це повільніше.

Іншим підходом було б використання селекторів:

selected = Array.prototype.map.apply(
    select.querySelectorAll('option[selected="selected"]'),
    [function (o) { return o.value; }]
);

Хіба функціональність першого вже не в Javascript?
Арлен Бейлер

1
Добре, зрозумів. Але перший може бути коротшим. Просто select.selectedOptions.
Арлен Бейлер

1
Це недолік простого JS порівняно з використанням бібліотек. Властивості selectedOptions бракує надійної підтримки браузера . Бібліотека, як jQuery, приховає це від вас. З 2013 року багато що змінилося, але швидкий Google показує, що люди все ще мають проблеми з selectedOptions.
uKolka

10

припустимо, що multiSelect є елементом множинного вибору, просто використовуйте його властивість selectedOptions:

//show all selected options in the console:

for ( var i = 0; i < multiSelect.selectedOptions.length; i++) {
  console.log( multiSelect.selectedOptions[i].value);
}

Замість того, щоб просто розміщувати код, збільште інформацію про те, як працює код.
Фітер

Будь ласка, не ставте фрагмент лише для JS, він безглуздий без HTML і видає лише помилки
Shadow Wizard вакцинує

@ShadowWizard зрозумів
KAFFEECKO

Зверніть увагу, що selectedOptionsIE не підтримує. developer.mozilla.org/en-US/docs/Web/API/…
2540625

4

Ось реалізація ES6 :

value = Array(...el.options).reduce((acc, option) => {
  if (option.selected === true) {
    acc.push(option.value);
  }
  return acc;
}, []);

Це чудово працює. Цікаво відзначити, що оскільки element.optionsце жива колекція, її не можна зменшити. Спочатку його потрібно перетворити на масив, як видно з наведеної вище відповіді.
Брендон

3

Перевір це:

HTML:

<select id="test" multiple>
<option value="red" selected>Red</option>
<option value="rock" selected>Rock</option>
<option value="sun">Sun</option>
</select>

Код одного рядка Javascript

Array.from(document.getElementById("test").options).filter(option => option.selected).map(option => option.value);

2

Ви можете спробувати цей сценарій

     <!DOCTYPE html>
    <html>
    <script>
    function getMultipleSelectedValue()
    {
      var x=document.getElementById("alpha");
      for (var i = 0; i < x.options.length; i++) {
         if(x.options[i].selected ==true){
              alert(x.options[i].value);
          }
      }
    }
    </script>
    </head>
    <body>
    <select multiple="multiple" id="alpha">
      <option value="a">A</option>
      <option value="b">B</option>
      <option value="c">C</option>
      <option value="d">D</option>
    </select>
    <input type="button" value="Submit" onclick="getMultipleSelectedValue()"/>
    </body>
    </html>

2

Ви можете використовувати [].reduceдля більш компактної реалізації підходу RobG :

var getSelectedValues =  function(selectElement) {
  return [].reduce.call(selectElement.options, function(result, option) {
    if (option.selected) result.push(option.value);
    return result;
  }, []);
};

Array.prototype.filter був би кращим варіантом[].filter.call(ele.options, e => e.selected)
megawac

2

Спираючись на відповідь Ріка Віскомі , спробуйте використати властивість selectedOptions елемента HTML Select :

let txtSelectedValuesObj = document.getElementById('txtSelectedValues');
[...txtSelectedValuesObj.selectedOptions].map(option => option.value);

Детально,

  • selectedOptions повертає список вибраних елементів.
  • Зокрема, він повертає HTMLCollection лише для читання, що містить HTMLOptionElements .
  • ...є поширеним синтаксисом . Це розширює HTMLCollectionросійські елементи.
  • [...]створює змінний Arrayоб'єкт з цих елементів, надаючи вам масив HTMLOptionElements.
  • map()замінює кожен HTMLObjectElementу масиві (тут його називають option) своїм значенням ( option.value).

Щільно, але, здається, це працює.

Обережно, IE selectedOptions не підтримує !


1

Те саме, що і попередня відповідь, але з використанням underscore.js.

function getSelectValues(select) {
    return _.map(_.filter(select.options, function(opt) { 
        return opt.selected; }), function(opt) { 
            return opt.value || opt.text; });
}

1

Мій помічник шаблону виглядає так:

 'submit #update': function(event) {
    event.preventDefault();
    var obj_opts = event.target.tags.selectedOptions; //returns HTMLCollection
    var array_opts = Object.values(obj_opts);  //convert to array
    var stray = array_opts.map((o)=> o.text ); //to filter your bits: text, value or selected
    //do stuff
}

1

Ось я.

const arr = Array.from(el.features.selectedOptions) //get array from selectedOptions property
const list = [] 
arr.forEach(item => list.push(item.value)) //push each item to empty array
console.log(list)

0

Код js Riot

this.GetOpt=()=>{

let opt=this.refs.ni;

this.logger.debug("Options length "+opt.options.length);

for(let i=0;i<=opt.options.length;i++)
{
  if(opt.options[i].selected==true)
    this.logger.debug(opt.options[i].value);
}
};

//**ni** is a name of HTML select option element as follows
//**HTML code**
<select multiple ref="ni">
  <option value="">---Select---</option>
  <option value="Option1 ">Gaming</option>
  <option value="Option2">Photoshoot</option>
</select>

0

Ви можете використовувати вибраний плагін jquery.

<head>
 <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.min.css"
 <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
 <script src="//cdnjs.cloudflare.com/ajax/libs/chosen/1.4.2/chosen.jquery.min.js"></script>
 <script>
        jQuery(document).ready(function(){
            jQuery(".chosen").data("placeholder","Select Frameworks...").chosen();
        });
 </script>
</head>

 <body> 
   <label for="Test" class="col-md-3 control label">Test</label>
      <select class="chosen" style="width:350px" multiple="true">
            <option>Choose...</option>
            <option>Java</option>                           
            <option>C++</option>
            <option>Python</option>
     </select>
 </body>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.