2014-02-17 3 views
3

Вот что происходит. У меня есть элемент select, для которого мне нужно получить строку с разделителями-запятыми из всех ее опций, независимо от того, выбран ли она.Создание строки с разделителями-запятыми, из выбранного элемента в jQuery

Как я могу, в JQuery/JavaScript принять это:

<select id="currentTags" multiple> 
     <option>Nature</option> 
     <option>Cats</option> 
     <option>Space</option> 
    </select> 

и превратить его в это:

"Nature, Cats, Space" 

Я пытался найти способы сделать это так и не смог ... Я все еще изучаю javascript, и мои ограниченные знания останавливают меня на моих треках.

Любая помощь будет оценена, даже если это просто для того, чтобы вести меня в правильном направлении. Спасибо за ваше время.

ответ

12

С JQuery:

var result = $('#currentTags option').map(function(i, opt) { 
    return $(opt).text(); 
}).toArray().join(', '); 

В простом JavaScript вы можете сделать что-то подобное, как это:

// Convert pseudo-arrays to real arrays 
var __slice = Array.prototype.slice; 

// Get select options as real array 
var opts = __slice.call(document.querySelectorAll('#currentTags option')); 

// Map the text of each option 
var result = opts.map(function(x) { 
    return x.textContent; 
}).join(', '); 

console.log(result); //=> "Nature, Cats, Space" 

Преимущество абстрагирования элементов в коллекции вместо зацикливания является то, что вы поддерживаете последовательный API (как jQuery), и вам не нужно создавать дополнительные переменные для псевдоресурсов, поскольку реальные массивы могут использовать все методы массива.

Смотрите MDN, чтобы узнать больше о DOM и методах и свойствах, которые можно использовать, как querySelectorAll, children, textContent и многое другое.

Редактировать: Это должно работать в IE9 + и во всех современных браузерах.

+1

Это невероятно сложно для новичок без объяснения того, что сделал каждый раздел.Я бы рекомендовал предлагать больше объяснений каждой строки. –

+0

Также не рекомендуется обрабатывать объекты хоста, такие как native, он будет работать не во всех версиях IE. – RobG

+0

Я добавил несколько комментариев и версию jQuery. Не знаете, как сделать это проще, не погружаясь в то, что такое псевдо-массивы и сопоставление, и это будет совершенно другой вопрос. – elclanrs

1

Простое решение будет:

// Initialize your string 
var output_string = ""; 

// For each 'option' tag, append its value to the string with the comma 
$('#currentTags option').each(function() { 
    output_string = output_string+this.text; 
}); 

// Removing the last ', ' which were added during the loop 
output_string = output_string.substr(0, output_string.length-2); 

Here's a Fiddle to see it into action :)

+0

@RobG: Извините, что: P, я принял во внимание вашу модификацию. – Littm

+0

Почти ... теперь '$ (this) .text()' должно быть просто 'this. text'. ;-) Прямой доступ к свойствам всегда будет намного быстрее (и меньше, чтобы писать), чтобы вызывающие функции выполняли то же самое. – RobG

1

Равнина старый Javascript (POJS) способ получить коллекцию Выбрать,-х вариантов, а затем цикл по нему, чтобы получить значения и создать строку с требуемым форматом, например

var options = document.getElementById('currentTags').options; 
var values = []; 

for (var i=0, iLen=options.length; i<iLen; i++) { 
    values.push(options[i].text); 
} 

alert(values.join(',')); 

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

+0

Должен признаться, я понимаю вашу версию лучше, чем я делаю @elclanrs прямо сейчас, что является плюсом. Я хотел бы знать, что вы подразумеваете под «может потерпеть неудачу» в некоторых браузерах. – wribit

+0

Решение elclanrs передает объект-хост (* NodeList *, возвращаемый * querySelctorAll *) в собственный метод javascript (* Array.prototype.slice *) как * this *. Хотя метод * slice * является общим, объекты хоста не обязаны вести себя как нативные объекты в этом случае, поэтому на него не следует полагаться. В таких браузерах, как IE 8 и ниже, этот сценарий, как известно, терпит неудачу. Приведенный выше подход согласуется с спецификациями W3C DOM, ECAM-262, различными опубликованными документами браузера и используемыми браузерами и поэтому имеет крайне низкую вероятность сбоя в этом отношении. – RobG

+0

А, хорошо, спасибо за разъяснение. Мы только беспокоимся о браузерах трех поколений назад. Хотя я знаю, что некоторые люди все еще используют более старые версии - этот конкретный сайт, который я создаю, является моим хобби, поэтому для меня это не волнует. Хотя это ценная информация для любого сайта, который я могу сделать в будущем, так что спасибо еще раз! – wribit

1

Как насчет:

var tags = []; 
$('#currentTags option').each(function() { 
    tags.push($(this).val()); 
}); 

console.log(tags.join(', ')); // 'Nature, Cats, Space' 

http://jsfiddle.net/wN2Dk/

1

Вот простой JQuery пример:

var arr = []; // create array 

$('#currentTags').children().each(function() { 
    arr.push($(this).text()); // add option text to array 
}); 

alert(arr.join(', ')); // Nature, Cats, Space 

Если вы хотите вариант value, переключатель text() в val();)

Смежные вопросы