ฉันจะเพิ่มตัวเลือกใน 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, text) ควรเป็น function (index, option) ทำงานได้ดีอย่างอื่น
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));
Matthew Clark

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

หากคุณต้องการระบุว่าตัวเลือก a) เป็นค่าเริ่มต้นที่เลือกไว้หรือไม่และควรเลือก b) ตอนนี้คุณสามารถผ่านพารามิเตอร์อีกสองพารามิเตอร์:

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

1
คุณจะตั้งค่าคุณสมบัติเช่นการเลือกค่าเริ่มต้นได้อย่างไร
Krishnan

20
ฉันชอบอันนี้ดีกว่า"<option></option>"วิธี; ดูเหมือนว่าสกปรก
Josh M.

1
ไม่ทำงานใน ie8 .. เพียงลองแล้วก็เห็นความคิดเห็นอื่นด้านล่างนี้
briansol

13

ด้วยปลั๊กอิน: jQuery เลือกกล่อง คุณสามารถทำได้:

var myOptions = {
        "Value 1" : "Text 1",
        "Value 2" : "Text 2",
        "Value 3" : "Text 3"
    }
    $("#myselect2").addOption(myOptions, false); 

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

การดำเนินการดร็อปดาวน์ทั่วไป (รับ, ตั้งค่า, เพิ่ม, ลบ) โดยใช้ jQuery


1
หากคุณใช้เครื่องหมายคำพูดคู่ภายในพารามิเตอร์ตัวเลือกของพวกเขาพวกเขาจะปิดฟังก์ชั่นและทำลายสคริปต์ การเปลี่ยน.prepend("...") / $("...")เป็น.prepend('...') / $('...')จะแก้ไขข้อมูลโค้ด
Heraldmonkey

4

Pease note @ 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 " คือidของรายการดรอปดาวน์และ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อะไรอย่างนั้นในวันที่ 2 ของฉัน.each()แม้ว่าฉันจะต้องได้รับ ID เฉพาะของวัตถุนั้นแล้วคว้าและส่งวัตถุทั้งหมดนั้นไปยังฟังก์ชั่นของฉันก่อนที่มันจะผนวก โชคดีที่ ID ของดรอปดาวน์ของฉันถูกคั่นด้วย "_" และฉันสามารถคว้าได้ ฉันไม่รู้สึกว่าฉันควรจะต้องทำ แต่มันให้ jQuery ข้อยกเว้นเป็นอย่างอื่น บางสิ่งที่คนอื่นกำลังดิ้นรนกับสิ่งที่ฉันอาจจะเพลิดเพลินไปกับการรู้


ทำไมคุณเพิ่มจำนวนตัวนับในแต่ละครั้ง คุณยังใหม่กับการเสแสร้ง? var counter = $ ('[id * = "ddlPosition _"]') ความยาวนั้นน้อยกว่า verbose และมีประสิทธิภาพมากกว่า ฉันคิดว่าคุณต้องการประสบการณ์เพิ่มอีกเล็กน้อยก่อนที่จะเริ่มโพสต์รหัสของคุณ นี่ไม่ใช่รหัสคุณภาพการผลิตเนื่องจากมีการเขียนไม่ดีและซับซ้อนเกินไปสำหรับงานที่ไม่สำคัญ ไม่มีความผิด แต่มีเหตุผลที่คุณมี 58 คำตอบและไม่โหวต
Athens Holloway

คุณเข้าใจผิดอย่างชัดเจนว่าฉันกำลังสร้างอะไร ตัวนับคือการเพิ่มค่าที่โพสต์ในรายการแบบหล่นลงและฉันมีหลายรายการที่มี ID เดียวกันเพียงแค่มี "_ ##" ที่แตกต่างกันในตอนท้ายดังนั้น .length () จะไม่ถูกต้อง นั่นคือเหตุผลสำหรับ "id * =" ในตัวเลือก
vapcguy

สำหรับคำตอบอื่น ๆ ของฉันฉันมักจะสนับสนุนวิธีการที่ง่ายกว่าเมื่อใดก็ตามที่เป็นไปได้เช่นกันและถ้าผู้คนไม่มีความลับในการเขียนโค้ดและเขียนสิ่งต่าง ๆ ที่ง่ายขึ้นคำตอบของฉันอาจมีคะแนนมากกว่า แต่ผู้คนต้องการทำให้ตัวเองดูดีและไม่เลือกอะไรที่ง่าย ไม่ได้ทำให้ฉันผิดที่ต้องการเพียงแค่อุตสาหกรรม ฉันไม่สนุกกับการแก้ไขปัญหาหรือสร้างรหัสของคนอื่นที่ซับซ้อนกว่าที่ควรจะเป็นอย่างน่าขัน
vapcguy

ฉันยังอาจมีความมั่นใจมากขึ้นใน $ (นี้). length () ในลูปนั้นมากกว่าถ้ามีใครสามารถอธิบายได้ว่าทำไมการส่ง "$ (นี้)" แทนที่จะเป็นวัตถุไปยัง 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)
        );
    });
} }

สิ่งนี้จะได้ผลสำหรับคุณ ....


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.