Як додати параметри до DropDownList за допомогою jQuery?


291

Як зазначено в питанні, як додати нову опцію до DropDownList за допомогою jQuery?

Дякую


Просто цікаво, чому це питання було скасовано? Можливо, тому, що на ній не показано жодного фрагмента коду :)
shasi kanth

Відповіді:


451

Без використання додаткових плагінів,

var myOptions = {
    val1 : 'text1',
    val2 : 'text2'
};
var mySelect = $('#mySelect');
$.each(myOptions, function(val, text) {
    mySelect.append(
        $('<option></option>').val(val).html(text)
    );
});

Якщо у вас було багато варіантів, або цей код потрібно запускати дуже часто, вам слід вивчити використання DocumentFragment, а не змінювати DOM багато разів без потреби. Щодо лише декількох варіантів, я б сказав, що цього не варто.

------------------------------- Додано ------------------ --------------

DocumentFragmentє хорошим варіантом для підвищення швидкості, але ми не можемо створити елемент опції, використовуючи, document.createElement('option')оскільки IE6 та IE7 не підтримують його.

Що ми можемо зробити, це створити новий елемент вибору, а потім додати всі параметри. Після завершення циклу додайте його до фактичного об'єкта DOM.

var myOptions = {
    val1 : 'text1',
    val2 : 'text2'
};
var _select = $('<select>');
$.each(myOptions, function(val, text) {
    _select.append(
            $('<option></option>').val(val).html(text)
        );
});
$('#mySelect').append(_select.html());

Таким чином ми змінимо DOM лише один раз!


8
Параметри методу трохи вводять в оману, наприклад, функція (val, текст) повинна бути функцією (індекс, опція). Добре працює інакше.
mbillard

14
@Crossbrowser: Я не згоден - valі textфактично описую змінні та їх використання.
nickf

1
лише для цього прикладу, однак як метод загального призначення ці змінні вводять в оману (це не дало мені поняття, як використовувати цей метод). Однак я скажу, що відповідь стосувалася не використання методу $ .each.
mbillard

1
Раніше я використовував mySelect.append(new Option(text, val));, що не працювало в IE8. Мені довелося перейти на @ nickf'smySelect.append($('<option></option>').val(val).html(text));
Меттью Кларк

5
@briansol:.attr('selected', true|false)
nickf

167

Без жодних плагінів це може бути простішим, не використовуючи стільки jQuery, замість того, щоб вийти трохи більше старої школи:

var myOptions = {
    val1 : 'text1',
    val2 : 'text2'
};
$.each(myOptions, function(val, text) {
    $('#mySelect').append( new Option(text,val) );
});

Якщо ви хочете вказати, чи є опція а) вибраним за замовчуванням значенням, і б) слід вибрати зараз, ви можете передати ще два параметри:

    var defaultSelected = false;
    var nowSelected     = true;
    $('#mySelect').append( new Option(text,val,defaultSelected,nowSelected) );

1
Як встановити такі властивості, як вибір значення за замовчуванням?
Крішнан

20
Мені це подобається краще, ніж "<option></option>"метод; що здається брудним.
Джош М.

1
не працює в ie8 .. просто спробував це, а також побачив інший коментар до цього нижче.
briansol


11

Ви можете очистити свій DropDown спочатку $ ('# DropDownQuality'). Empty ();

Я мав, щоб мій контролер у MVC повернув список вибору лише одним елементом.

$('#DropDownQuality').append(
        $('<option></option>').val(data[0].Value).html(data[0].Text));    

7

Додайте елемент до списку на початку

$("#ddlList").prepend('<option selected="selected" value="0"> Select </option>');

Додайте елемент до списку в кінці

$('<option value="6">Java Script</option>').appendTo("#ddlList");

Загальна операція випадання (Get, Set, Add, Remove) за допомогою jQuery


1
Якщо ви використовуєте подвійні лапки всередині параметрів опції, вони закриють функцію та порушать сценарій. Змінення .prepend("...") / $("...")на .prepend('...') / $('...')виправить фрагмент.
Heraldmonkey

4

Зауваження Pease @ Рік Phrogz не працює в IE 8, а @ nickf працює у всіх основних браузерах. Ще один підхід:

$.each(myOptions, function(val, text) {
    $("#mySelect").append($("&lt;option/&gt;").attr("value", val).text(text));
});

3

Ви можете використовувати прямий

$"(.ddlClassName").Html("<option selected=\"selected\" value=\"1\">1</option><option value=\"2\">2</option>")

-> Тут ви можете використовувати прямий рядок



0

використовуючи jquery, який ви можете використовувати

      this.$('select#myid').append('<option>newvalue</option>');

де " myid " - ідентифікатор випадаючого списку, а newvalue - текст, який потрібно вставити.


0

Мені потрібно було додати стільки варіантів до спадних місць, скільки було спаднень на моїй сторінці. Тому я використовував це таким чином:

function myAppender(obj, value, text){
    obj.append($('<option></option>').val(value).html(text));
}

$(document).ready(function() {
    var counter = 0;
    var builder = 0;
    // Get the number of dropdowns
    $('[id*="ddlPosition_"]').each(function() {
        counter++;
    });

    // Add the options for each dropdown
    $('[id*="ddlPosition_"]').each(function() {
        var myId = this.id.split('_')[1];

        // Add each option in a loop for the specific dropdown we are on
        for (var i=0; i<counter; i++) {
            myAppender($('[id*="ddlPosition_'+myId+'"]'), i, i+1);
        }
        $('[id*="ddlPosition_'+myId+'"]').val(builder);
        builder++;
    });
});

Це динамічно налаштовує спадні місця зі значеннями від 1 до n та автоматично вибирає значення для порядку, у якому було спадне меню (тобто 2-е спадне меню отримало "2" у полі тощо).

Це було смішно, що я не міг використовувати thisабо this.Objectабо $.objщось подібне у своєму другому .each(), хоча --- я фактично повинен був отримати конкретний ідентифікатор цього об’єкта, а потім схопити та передати весь цей об’єкт у свою функцію, перш ніж він додаватиметься. На щастя, ідентифікатор мого спаду був відокремлений символом "_", і я міг його схопити. Я не відчуваю, що мені довелося це робити, але інакше мені давали винятки jQuery. Щось, що бореться з тим, що мені подобається, знаю.


Чому ви збільшуєте лічильник у кожному? Ви новачок у jquery? var counter = $ ('[id * = "ddlPosition _"]'). довжина менш докладна і ефективніша. Я думаю, що вам потрібно трохи більше досвіду, перш ніж ви почнете публікувати свій код. Це не якість якості виробництва, оскільки він погано написаний і надмірно складний для такого тривіального завдання. Без образи, але є причина, що у вас 58 відповідей і немає голосів.
Афіни Холлоуей

Ви, очевидно, неправильно зрозуміли, що я створював. Лічильник збільшує значення, розміщене у спадному меню, і у мене було декілька з однаковим ідентифікатором, просто з іншим "_ ##" в кінці, тому .length () було б неточним. Це причина "id * =" у селекторі.
vapcguy

Що стосується інших моїх відповідей, то, як правило, я виступаю за більш прості методи, коли це можливо, і якби люди не були настільки езотеричними зі своїм кодуванням і писали речі, які були більш спрощеними, мої відповіді, ймовірно, мали б більше голосів. Але люди хочуть зробити так, щоб вони виглядали розумними, і тому вони не виберуть щось таке просте. Це не робить мене неправильним у тому, що я хочу просто галузь. Мені не подобається усунення несправностей або надбудова коду інших людей, який смішно складніший, ніж це має бути.
vapcguy

Я також міг би мати більше впевненості в $ (this) .length () в цьому циклі більше, якщо хтось міг би пояснити, чому надсилання "$ (this)" замість об'єкта на myAppender не працює.
vapcguy

0

Давайте подумаємо, що ваша відповідь - "successData". Він містить список, який потрібно додати як параметри у спадному меню.

success: function (successData) {
var sizeOfData = successData.length;
if (sizeOfData == 0) {
    //    NO DATA, throw an alert ...
    alert ("No Data Found");
} else {
    $.each(successData, function(val, text) {
        mySelect.append(
            $('<option></option>').val(val).html(text)
        );
    });
} }

Це працювало б для вас….


-1

спробуйте цю функцію:

function addtoselect(param,value){
    $('#mySelectBox').append('&lt;option value='+value+'&gt;'+param+'&lt;/option&gt;');
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.