2010-02-18 5 views
39

Я пытаюсь захватить все выбранные элементы в следующем порядке выбора и разделить их запятой. Код ниже:JQuery - несколько опций выбора

<select id="ps-type" name="ps-type" multiple="multiple" size="5"> 
    <option>Residential - Wall Insulation</option> 
    <option>Residential - Attic /Crawl Space Insulation</option> 
    <option>Residential - Foundation Insulation</option> 
    <option>Residential - Exterior Roof System</option> 
    <option>Commercial - Wall Insulation</option> 
    <option>Commercial - Air Barrier System (Walltite)</option> 
    <option>Commercial - Roof System</option> 
</select> 

результата я ищу заключается в следующем:

Жилого - утепление стен, Коммерческого - утепление стен, ...

Спасибо за помощь. -B

ответ

71

Вы можете использовать селектор :selected, а встроенная функция $.map() - часть вашей цепочки.

$("option:selected").map(function(){ return this.value }).get().join(", "); 
+6

Согласен. Для полной сексуальности jQuery карта() - это, безусловно, путь. – user113716

+8

Полный jQuery Сексуальность обязательна;) – Sampson

+0

избили меня, .map() путь более элегантный! –

1

Что-то вроде этого следует сделать трюк:

var result = ""; 
$('#ps-type option:selected').each(function(i, item){ 
    result += $(this).val() + ", "; 
}); 
2
var list = ""; 
$('#ps-type option:selected').each(function(){ 
    list += this.value + ", "; 
}); 
return list.substr(0, list.length - 2); 
+0

вы пропустили :selected после "опции" иначе вы бы выбрать все опции, а не только те, которые выбраны –

+0

Хорошее место, добавили его сейчас :-) –

22

Добавить значения в массив и использовать join для создания строки:

var items = []; 
$('#ps-type option:selected').each(function(){ items.push($(this).val()); }); 
var result = items.join(', '); 
+1

Вам нужен текст(), а не val() – kgiannakakis

+1

'val()' на самом деле все равно получит текст из опции if th ere не является атрибутом значения. –

+0

Я только что попробовал, val() работает просто отлично. –

1

Здесь вы идете:

var result = new Array(); 

$("#ps-type option:selected").each(function() { 
    result.push($(this).val()); 
}); 

var output = result.join(", "); 
9

На множественном выборе элемента, то val командования select элемента возвращает массив выбранных значений опций. Если значения не присутствуют, текст элемента используется:

var output = $("#ps-type").val().join(', '); 

обновление: Однако, когда нет выбранных опций val() возвращает null не пустой массив. Один из способов обойти это:

var output = ($("#ps-type").val() || []).join(', '); 

Вы можете поиграть с ним в this demo I put together.

От the docs:

В случае <select multiple="multiple"> элементов, метод .val() возвращает массив, содержащий каждую выбранную опцию.

+0

Ошибки, если не выбраны никакие параметры, верно? –

+0

@ Russell, хороший пункт. Я обновил свой ответ, чтобы разместить его без выбора. Есть и множество других способов. –

+0

Отличное решение. Благодаря! –

0

$(function() { 
 
     $('#colorselector').change(function(){ 
 
      $('.colors').hide(); 
 
      $('#' + $(this).val()).show(); 
 
     }); 
 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<Select id="colorselector" multiple="multiple" size="2"> 
 
    <option value="red">Red</option> 
 
    <option value="yellow">Yellow</option> 
 
    <option value="blue">Blue</option> 
 
</Select> 
 
<div id="red" class="colors" style="display:none"> red... </div> 
 
<div id="yellow" class="colors" style="display:none"> yellow.. </div> 
 
<div id="blue" class="colors" style="display:none"> blue.. </div>

+0

Было бы лучше, если бы вы добавили некоторые комментарии, почему вы написали/отредактировали этот код, чтобы другие могли понять. –

0

Попробуйте это:

var List = new Array(); 
    $('#ps-type option:selected').each(function() { 
     if ($(this).length) { 
       var sel= { 
        name: $this.text() 
       } 
     } 
     List.push(sel); 
    }); 
    var result = List.join(', ');