2008-10-23 5 views
4

Интересно, может ли кто-нибудь предложить лучший способ перебора всех <option> s в элементе <select> с jQuery и построении массив.Loop через <select> и построить массив в формате: «value1», «value2», «value3»

Например.

Вместо следующего, в результате чего строка, модули передается в autoCompleteArray(),

$("#CityLocal").autocompleteArray(
     [ 
      "Aberdeen", "Ada", "Adamsville", "Zoar" //and a million other cities... 
     ], 
     { 
      delay:10, 
      minChars:1, 
      matchSubset:1, 
      onItemSelect:selectItem, 
      onFindValue:findValue, 
      autoFill:true, 
      maxItemsToShow:10 
     } 
    ); 

... Мне нужно перебрать все <options> в <select> и толкать их в массив, а просто передать эту переменную массива функции вместо длинной строки.

Например,

$("#CityLocal").autocompleteArray(
      [ 
       MyBigArrayOfOptions 
      ], 
      { 
       delay:10, 
       minChars:1, 
       matchSubset:1, 
       onItemSelect:selectItem, 
       onFindValue:findValue, 
       autoFill:true, 
       maxItemsToShow:10 
      } 
     ); 

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

Спасибо.

ответ

8

Это должно работать:

$(document).ready(function(){ 
    // array of option elements' values 
    var optionValues = []; 
    // array of option elements' text 
    var optionTexts = []; 

    // iterate through all option elements 
    $('#sel > option').each(function() { 
    // get value/text and push it into respective array 
    optionValues.push($(this).val()); 
    optionTexts.push($(this).text()); 
    }); 

    // test with alert 
    alert(optionValues); 
    alert(optionTexts); 
}); 

Учитывая, что ваш select элемент имеет ID Сель.

+0

Как бы фильтровать это только для выбранных элементов ? – 2009-07-23 12:59:56

+0

В цикле `.each`: if (this.selected) { // код для push } – 2009-07-24 15:39:11

6

Функция jQuery.map может быть тем, что вы ищете. В приведенном ниже коде будет создан массив, содержащий все значения или текстовые значения для параметров <select>.

var values = jQuery.map(jQuery("#select")[0].options, function(option) 
      { 
       return option.value; 
      }); 

var texts = jQuery.map(jQuery("#select")[0].options, function(option) 
      { 
       return option.innerHTML; 
      }); 
2

Все, что вам нужно сделать, это передать массив в качестве первого параметра без скобок. Скобки создают новый массив, но вам не нужно это делать, потому что вы уже передаете массив. Вобще:

$("#CityLocal").autocompleteArray(
       MyBigArrayOfOptions, 
       { 
         delay:10, 
         minChars:1, 
         matchSubset:1, 
         onItemSelect:selectItem, 
         onFindValue:findValue, 
         autoFill:true, 
         maxItemsToShow:10 
       } 
     ); 
2

Если я правильно понял ваш вопрос corrently, следующий код должен делать то, что вам нужно:

myFunction($("#my-select option")); 

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

myFunction($("option", theSelect)); 

затыкать эту идею обратно в код:

$("#CityLocal").autocompleteArray(
    $("option", theSelect), 
    { 
      delay:10, 
      minChars:1, 
      matchSubset:1, 
      onItemSelect:selectItem, 
      onFindValue:findValue, 
      autoFill:true, 
      maxItemsToShow:10 
    } 
); 
Смежные вопросы