Идиоматический JQuery, чтобы получить все параметры в списке в строке через запятую? - PullRequest
7 голосов
/ 17 ноября 2010

Где lb - это список, txtfield - это текстовое поле, этот код принимает все значения параметров, помещает их в массив и превращает в список через запятую:

var arr = [];
for (var i = 0; i < lb.length; i++) {
    arr[i] = lb.options[i].value;
}
txtfield.value = arr.join(',');

lb.options.toString (), очевидно, не работает, потому что это массив параметров (значение и текст).Я не нашел ничего более лаконичного, чем этот.

Что такое способ jQuery?Я попытался возиться с $(lb).each(), но, похоже, не могу заставить его работать таким же образом.

Ответы [ 6 ]

13 голосов
/ 17 ноября 2010
txtfield.value = $(lb.options).map(function() { 
                                       return this.value; 
                                   }).get().join(',');

Этот использует .map() для создания объекта jQuery, возвращая value каждого option, затем использует .get() для извлечения массива из объекта.


РЕДАКТИРОВАТЬ: Как @ Ник Крейвер отметил в комментарии ниже, если вам нужно получить оптимальную производительность (с JQuery), имеет смысл использовать 1018 * вариант , так как у вас уже есть коллекция. Подробнее см. Его ответ .


РЕДАКТИРОВАТЬ: Чтобы повысить производительность, выполните цикл for, но сохраните ссылки на свойства. Это имеет значение .

var arr = [], opts = lb.options, len = opts.length;
for (var i = 0; i < len; i++) {
    arr[i] = opts[i].value;
}
txtfield.value = arr.join(',');
6 голосов
/ 17 ноября 2010

Версия jQuery: .map() примерно так:

var arr = $(lb).find("option").map(function() { return this.value; }).get();
txtfield.value = arr.join(',');

Или чуть быстрее с $.map() вот так:

var arr = $.map(lb.options, function(o) { return o.value; });
txtfield.value = arr.join(',');

Однако оба значительно менее эффективны , чем цикл for, используйте простую версию JavaScript, которая у вас уже есть.

5 голосов
/ 17 ноября 2010

Посмотрите на map() ..

$('#lbID option').map(function() {
  return $(this).val();
}).get().join(',');
3 голосов
/ 17 ноября 2010

Это jQuery-эквивалент вашего кода. Однако есть и более элегантные решения.

var values = [];

$(lb).children('option').each(function () {
   values.push($(this).text());
});

$(txtfield).val(values.join(','));
2 голосов
/ 17 ноября 2010

Можно ли так, но я не уверен, чего вы пытаетесь достичь?

$('option', $(lb)).each(function() { arr.push($(this).text()) });
1 голос
/ 14 октября 2015

См. Демо здесь: Демо Fiddler

Вы можете получить несколько выбранных опций Текстовые значения с разделителем.

 $('#testID').change(function () {
        var test=$(this).find("option:selected").map(function () {
        return $(this).text();
    }).get().join('//');
     alert(test);
            });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<select id="testID" multiple="multiple">
    <option value="1">test Value1</option>
    <option value="2">test Value2</option>
    <option value="3">test Value3</option>
    <option value="4">test Value4</option>
    <option value="5">test Value5</option>
    <option value="6">test Value6</option>
</select>
<input type="button" value="Get dropdown selected Value" id="select-values">
    <div id="result"></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...