Додавання параметрів для вибору за допомогою JavaScript


161

Я хочу, щоб цей JavaScript створив параметри від 12 до 100 у виді з id = "mainSelect", тому що я не хочу створювати всі теги параметрів вручну. Чи можете ви дати мені кілька покажчиків? Дякую

function selectOptionCreate() {

  var age = 88;
  line = "";
  for (var i = 0; i < 90; i++) {
    line += "<option>";
    line += age + i;
    line += "</option>";
  }

  return line;
}


14
Голосуючи за повторне відкриття, оскільки пов'язаний "дублікат" має лише відповіді на основі jQuery, тоді як для цього потрібен (або принаймні передбачає вимогу) звичайний JavaScript.
Девід каже повернути Моніку

3
Чудова відповідь тут :mySelect.options[mySelect.options.length] = new Option('Text 1', 'Value1');
ruffin

Відповіді:


254

Ви можете досягти цього за допомогою простого forциклу:

var min = 12,
    max = 100,
    select = document.getElementById('selectElementId');

for (var i = min; i<=max; i++){
    var opt = document.createElement('option');
    opt.value = i;
    opt.innerHTML = i;
    select.appendChild(opt);
}

JS Fiddle демо .

Порівняння JS Perf як моєї, так і відповіді Симе Відаса , запустити, тому що я вважав, що його виглядає трохи зрозуміліше / інтуїтивніше, ніж моє, і я задумався, як це перетвориться на реалізацію. Згідно з Chromium 14 / Ubuntu 11.04, міна дещо швидша, однак інші браузери / платформи, мабуть, мають різні результати.


Відредаговано у відповідь на коментар з ОП:

[Як] застосувати [I] це до декількох елементів?

function populateSelect(target, min, max){
    if (!target){
        return false;
    }
    else {
        var min = min || 0,
            max = max || min + 100;

        select = document.getElementById(target);

        for (var i = min; i<=max; i++){
            var opt = document.createElement('option');
            opt.value = i;
            opt.innerHTML = i;
            select.appendChild(opt);
        }
    }
}
// calling the function with all three values:
populateSelect('selectElementId',12,100);

// calling the function with only the 'id' ('min' and 'max' are set to defaults):
populateSelect('anotherSelect');

// calling the function with the 'id' and the 'min' (the 'max' is set to default):
populateSelect('moreSelects', 50);

JS Fiddle демо .

І, нарешті (після досить затримки ...), підхід, який поширює прототип протоколу HTMLSelectElementз метою ланцюга populate()функції, як методу, до вузла DOM:

HTMLSelectElement.prototype.populate = function (opts) {
    var settings = {};

    settings.min = 0;
    settings.max = settings.min + 100;

    for (var userOpt in opts) {
        if (opts.hasOwnProperty(userOpt)) {
            settings[userOpt] = opts[userOpt];
        }
    }

    for (var i = settings.min; i <= settings.max; i++) {
        this.appendChild(new Option(i, i));
    }
};

document.getElementById('selectElementId').populate({
    'min': 12,
    'max': 40
});

JS Fiddle демо .

Список літератури:


@Jack: погодився, і я застосував такий підхід в останньому редагуванні :)
Девід говорить, що поверніть Моніку

Також розширення прототипів хоста (хоча і спокусливо) вважається поганою ідеєю .
RobG

Я думаю, що це слід оновити, щоб використовувати innerTextзамість того, innerHTMLщоб уникнути вразливих сценаріїв між сайтом. Як ви думаєте, @DavidThomas?
Abhi Beckert

20

Ось вам:

for ( i = 12; i <= 100; i += 1 ) {
    option = document.createElement( 'option' );
    option.value = option.text = i;
    select.add( option );
}

Демо-версія: http://jsfiddle.net/mwPb5/


Оновлення: оскільки ви хочете повторно використовувати цей код, ось його функція:

function initDropdownList( id, min, max ) {
    var select, i, option;

    select = document.getElementById( id );
    for ( i = min; i <= max; i += 1 ) {
        option = document.createElement( 'option' );
        option.value = option.text = i;
        select.add( option );
    }
}

Використання:

initDropdownList( 'mainSelect', 12, 100 );

Демонстраційна демонстрація: http://jsfiddle.net/mwPb5/1/


як я застосувати це до декількох елементів?
jacktheripper

9

Найбільш стислий та інтуїтивний спосіб:

var selectElement = document.getElementById('ageselect');

for (var age = 12; age <= 100; age++) {
  selectElement.add(new Option(age));
}
Your age: <select id="ageselect"><option value="">Please select</option></select>

Ви також можете диференціювати ім'я та значення або додати елементи на початку списку з додатковими параметрами до використовуваних функцій:
HTMLSelect Element .add (item [, раніше]);
нова опція (текст, значення, за замовчуваннямВибрано, вибрано);


8

Я не рекомендую робити маніпуляції з DOM всередині циклу - це може дорого придбати великі набори даних. Натомість я б зробив щось подібне:

var elMainSelect = document.getElementById('mainSelect');

function selectOptionsCreate() {
  var frag = document.createDocumentFragment(),
    elOption;
  for (var i=12; i<101; ++i) {
    elOption = frag.appendChild(document.createElement('option'));
    elOption.text = i;
  }
  elMainSelect.appendChild(frag);
}

Докладніше про DocumentFragment можна прочитати на MDN , але ось суть цього:

Він використовується як невелика версія документа для зберігання сегмента структури документа, що складається з вузлів, подібно до стандартного документа. Ключова відмінність полягає в тому, що, оскільки фрагмент документа не є частиною фактичної структури DOM, зміни, внесені до фрагменту, не впливають на документ, не викликають перезарядження або не спричиняють будь-якого впливу на продуктивність, який може відбутися під час внесення змін.


4

Я уникаю того, щоб робити операції DOM в циклі, щоб уникнути повторного повторного відображення сторінки.

var firstSelect = document.getElementById('first select elements id'),
    secondSelect = document.getElementById('second select elements id'),
    optionsHTML = [],
    i = 12;

for (; i < 100; i += 1) {
  optionsHTML.push("<option value=\"Age" + i + "\">Age" + i + "</option>";
}

firstSelect.innerHTML = optionsHTML.join('\n');
secondSelect.innerHTML = optionsHTML.join('\n');

Редагувати: видалено функцію, щоб показати, як ви можете просто призначити створений html іншому елементу вибору - таким чином уникнути зайвого циклу шляхом повторення виклику функції.


як я застосувати це до декількох елементів?
jacktheripper

Не впевнений, що я дотримуюся - ви хочете додати однакові параметри до декількох елементів вибору?
кінакута

Так, я хочу коробки з тими ж варіантами
jacktheripper

Я включив його у функцію, до якої можна зателефонувати, де ви просто перейдете в id елемента вибору, до якого потрібно додати параметри.
кінакута

2
Саме для цього створено documentFragment. Ви можете легко змінити прийняту відповідь, щоб параметри додавались до DocumentFragment спочатку, запобігаючи багаторазовому відображенню.
Сам Браславський


1

Коли ви створюєте новий Optionоб'єкт, необхідно передати два параметри: Перший - це текст, який потрібно відобразити у списку, а другий - значення, яке має бути призначене параметру.

var myNewOption = new Option("TheText", "TheValue");

Потім ви просто призначите цей Optionоб'єкт порожньому елементу масиву, наприклад:

document.theForm.theSelectObject.options[0] = myNewOption;

0

Жодне з перерахованих вище рішень не працювало для мене. Метод додавання не помилився, коли я спробував, але це не вирішило мою проблему. Врешті-решт я вирішив свою проблему із властивістю даних select2. Я використав json і отримав масив, а потім даю його в ініціалізації select2. Більш детально ви можете побачити мою відповідь нижче за публікацією.

https://stackoverflow.com/a/41297283/4928277


0

Часто у вас є масив пов’язаних записів, я можу легко і досить декларативно заповнити selectцей спосіб:

selectEl.innerHTML = array.map(c => '<option value="'+c.id+'">'+c.name+'</option>').join('');

Це замінить існуючі параметри.
Ви можете selectEl.insertAdjacentHTML('afterbegin', str);замість цього додати їх до вершини.
І selectEl.insertAdjacentHTML('beforeend', str);додати їх до нижньої частини списку.

IE11 сумісний синтаксис:

array.map(function (c) { return '<option value="'+c.id+'">'+c.name+'</option>'; }).join('');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.