Menambahkan opsi untuk dipilih dengan javascript

161

Saya ingin javascript ini membuat opsi dari 12 hingga 100 dalam pilih dengan id = "mainSelect", karena saya tidak ingin membuat semua tag opsi secara manual. Bisakah Anda memberi saya beberapa petunjuk? Terima kasih

function selectOptionCreate() {

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

  return line;
}
jacktheripper
sumber
14
Memilih untuk membuka kembali, karena 'duplikat' yang ditautkan hanya memiliki jawaban berbasis jQuery, sedangkan jawaban ini memerlukan (atau setidaknya menyiratkan persyaratan) JavaScript biasa.
David mengatakan mengembalikan Monica
3
Jawaban yang bagus di sini :mySelect.options[mySelect.options.length] = new Option('Text 1', 'Value1');
ruffin 615

Jawaban:

254

Anda bisa mencapainya dengan forloop sederhana :

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);
}

Demo JS Fiddle .

Perbandingan JS Perf dari jawaban saya dan Sime Vidas , berjalan karena saya pikir dia tampak sedikit lebih dimengerti / intuitif daripada milik saya dan saya bertanya-tanya bagaimana itu akan diterjemahkan ke dalam implementasi. Menurut saya, Chromium 14 / Ubuntu 11.04 lebih cepat, browser / platform lain cenderung memiliki hasil yang berbeda.


Diedit dalam menanggapi komentar dari OP:

[Bagaimana] [saya] menerapkan ini pada lebih dari satu elemen?

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);

Demo JS Fiddle .

Dan, akhirnya (setelah cukup lama ...), sebuah pendekatan yang memperluas prototipe HTMLSelectElementuntuk rantai populate()fungsi, sebagai metode, ke simpul 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
});

Demo JS Fiddle .

Referensi:

David mengatakan mengembalikan Monica
sumber
@ Jack: setuju, dan saya telah menggunakan pendekatan itu dalam edit terakhir :)
David mengatakan mengembalikan Monica
Juga, memperpanjang prototipe host (sambil menggoda) dianggap sebagai ide yang buruk .
RobG
Saya pikir ini harus diperbarui untuk digunakan innerTextdaripada innerHTMLuntuk menghindari kerentanan skrip lintas situs. Bagaimana menurut Anda @DavidThomas?
Abhi Beckert
20

Ini dia:

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

Demo langsung: http://jsfiddle.net/mwPb5/


Pembaruan: Karena Anda ingin menggunakan kembali kode ini, inilah fungsinya:

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 );
    }
}

Pemakaian:

initDropdownList( 'mainSelect', 12, 100 );

Demo langsung: http://jsfiddle.net/mwPb5/1/

Šime Vidas
sumber
bagaimana cara menerapkan ini ke lebih dari satu elemen?
jacktheripper
9

Cara yang paling ringkas dan intuitif adalah:

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>

Anda juga dapat membedakan nama dan nilai atau menambahkan item di awal daftar dengan parameter tambahan untuk fungsi yang digunakan:
HTMLSelect Element .add (item [, sebelum]);
Opsi baru (teks, nilai, default Dipilih, dipilih);

pengguna
sumber
8

Saya tidak merekomendasikan melakukan manipulasi DOM dalam satu loop - yang bisa mahal dalam dataset besar. Sebaliknya, saya akan melakukan sesuatu seperti ini:

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);
}

Anda dapat membaca lebih lanjut tentang DocumentFragment di MDN , tetapi inilah intinya:

Ini digunakan sebagai versi ringan Dokumen untuk menyimpan segmen struktur dokumen yang terdiri dari node seperti dokumen standar. Perbedaan utama adalah bahwa karena fragmen dokumen bukan bagian dari struktur DOM yang sebenarnya, perubahan yang dilakukan pada fragmen tidak mempengaruhi dokumen, menyebabkan reflow, atau menimbulkan dampak kinerja yang dapat terjadi ketika perubahan dilakukan.

Terima kasih
sumber
4

Satu hal yang saya hindari adalah melakukan operasi DOM dalam satu lingkaran untuk menghindari pengulangan ulang halaman.

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');

Sunting: menghapus fungsi untuk menunjukkan bagaimana Anda bisa menetapkan html yang telah Anda buat ke elemen pilih lainnya - sehingga menghindari perulangan yang tidak perlu dengan mengulangi panggilan fungsi.

kinakuta
sumber
bagaimana cara menerapkan ini ke lebih dari satu elemen?
jacktheripper
Tidak yakin saya mengikuti - Anda ingin menambahkan opsi yang sama ke lebih dari satu elemen pilih?
kinakuta
Ya, saya ingin kotak dengan opsi yang sama
jacktheripper
Saya memfaktorkannya ke dalam fungsi yang dapat Anda panggil di mana Anda baru saja menambahkan id elemen pilihan yang ingin Anda tambahkan opsi.
kinakuta
2
Untuk itulah documentFragment dibuat. Anda dapat dengan mudah mengubah jawaban yang diterima sehingga opsi akan ditambahkan ke documentFragment pada awalnya, mencegah beberapa rendering.
Sam Braslavskiy
1

Saat Anda membuat Optionobjek baru , ada dua parameter yang harus dilewati: Yang pertama adalah teks yang ingin Anda tampilkan dalam daftar, dan yang kedua nilai yang akan diberikan ke opsi.

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

Anda kemudian cukup menetapkan Optionobjek ini ke elemen array kosong, misalnya:

document.theForm.theSelectObject.options[0] = myNewOption;
mohan mu
sumber
0

Tidak ada solusi di atas yang berfungsi untuk saya. Tambahkan metode tidak memberikan kesalahan ketika saya mencoba tetapi tidak menyelesaikan masalah saya. Pada akhirnya saya memecahkan masalah saya dengan properti data select2. Saya menggunakan json dan mendapatkan array dan kemudian memberikannya di select2 elemen initialize. Untuk lebih jelasnya Anda bisa melihat jawaban saya di posting di bawah ini.

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

Engin Aydogdu
sumber
0

Seringkali Anda memiliki serangkaian catatan terkait, saya merasa mudah dan cukup deklaratif untuk mengisi selectcara ini:

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

Ini akan menggantikan opsi yang ada.
Anda dapat menggunakannya selectEl.insertAdjacentHTML('afterbegin', str);untuk menambahkannya ke atas.
Dan selectEl.insertAdjacentHTML('beforeend', str);menambahkannya ke bagian bawah daftar.

Sintaks yang kompatibel dengan IE11:

array.map(function (c) { return '<option value="'+c.id+'">'+c.name+'</option>'; }).join('');
pengguna
sumber