เปลี่ยนค่าที่เลือกของรายการแบบหล่นลงด้วย jQuery


840

ฉันมีรายการแบบหล่นลงพร้อมค่าที่ทราบ สิ่งที่ฉันพยายามทำคือการกำหนดรายการแบบหล่นลงให้เป็นค่าโดยเฉพาะอย่างยิ่งที่ฉันรู้อยู่แล้วโดยใช้jQuery ใช้JavaScriptปกติฉันจะทำสิ่งที่ชอบ:

ddl = document.getElementById("ID of element goes here");
ddl.value = 2; // 2 being the value I want to set it too.

อย่างไรก็ตามฉันต้องทำกับjQueryเพราะฉันใช้คลาสCSSสำหรับตัวเลือกของฉัน ( รหัสASP.NETไคลเอ็นต์โง่... )

นี่คือบางสิ่งที่ฉันได้ลอง:

$("._statusDDL").val(2); // Doesn't find 2 as a value.
$("._statusDDL").children("option").val(2) // Also failed.

ฉันจะทำกับjQuery ได้อย่างไร


ปรับปรุง

เมื่อปรากฎออกมาฉันพูดถูกครั้งแรกด้วย:

$("._statusDDL").val(2);

เมื่อฉันวางการแจ้งเตือนไว้ด้านบนมันทำงานได้ดี แต่เมื่อฉันลบการแจ้งเตือนและปล่อยให้มันทำงานด้วยความเร็วเต็มฉันได้รับข้อผิดพลาด

ไม่สามารถตั้งค่าคุณสมบัติที่เลือก ดัชนีไม่ถูกต้อง

ฉันไม่แน่ใจว่าเป็นข้อผิดพลาดกับ jQuery หรือInternet Explorer 6 (ฉันเดา Internet Explorer 6 ) แต่มันน่ารำคาญมาก


21
ปัญหาที่เกิดขึ้นที่นี่เป็นปัญหากับ IE6 ฉันกำลังสร้างองค์ประกอบตัวเลือกใหม่สำหรับองค์ประกอบที่เลือกจากนั้นพยายามตั้งค่าเป็นหนึ่งในองค์ประกอบตัวเลือกที่สร้างขึ้นใหม่ IE6 รออย่างไม่ถูกต้องจนกว่าจะได้รับการควบคุมกลับจากสคริปต์เพื่อสร้างองค์ประกอบใหม่ใน DOM อย่างมีประสิทธิภาพสิ่งที่เกิดขึ้นคือฉันพยายามตั้งค่ารายการแบบหล่นลงเป็นตัวเลือกที่ยังไม่มีอยู่แม้ว่าควรจะมี
phairoh

คุณสามารถใช้จาวาสคริปต์ที่บริสุทธิ์dd1 = document.getElementsByClassName('classname here'); dd1.value = 2;
user2144406

คำตอบ:


1008

เอกสารประกอบของ jQuery :

[jQuery.val] ตรวจสอบหรือเลือกปุ่มตัวเลือกทั้งหมดช่องทำเครื่องหมายและตัวเลือกการเลือกที่ตรงกับชุดของค่า

พฤติกรรมนี้อยู่ในjQueryรุ่น1.2ขึ้นไป

คุณน่าจะต้องการสิ่งนี้มากที่สุด:

$("._statusDDL").val('2');

22
มันใช้งานได้ถ้าselectถูกซ่อนอยู่ ( display: none;)? ฉันไม่สามารถได้รับมันในการทำงานที่ถูกต้อง ...
Padel

11
นี่เพิ่งช่วยฉันจากการเขียนสิ่งต่างๆเช่น $('._statusDDL [value="2"]').attr('selected',true);ขอบคุณ!
บาซิล

6
@Nordes นั้นจะเป็นกรณีนี้หากรับค่าที่เลือก ในกรณีนี้เป็นการตั้งค่าที่เลือกหรือมากกว่านั้นอย่างแม่นยำตั้งค่าตัวเลือกที่เลือก
Jon P

107
@JL: คุณต้องเพิ่ม.change()เพื่อดูตัวเลือกในส่วนรายการแบบหล่นลงนั่นคือ$('#myID').val(3).change();
Kai Noack

10
ควรเพิ่มการผูกมัด. change () ลงในคำตอบ ฉันคิดว่าฉันจะเสียสติไปกับวิธีแก้ปัญหานี้ไม่ทำงานจนกว่าฉันจะอ่านความคิดเห็น
David Baucum

139

ด้วยฟิลด์ที่ซ่อนอยู่คุณต้องใช้ดังนี้:

$("._statusDDL").val(2);
$("._statusDDL").change();

หรือ

$("._statusDDL").val(2).change();

คุณช่วยอธิบายได้ไหมว่าเหตุใดคุณจึงต้องเริ่มเปลี่ยนเหตุการณ์สำหรับเขตข้อมูลที่ซ่อนอยู่
ซามูเอล

1
@Samuel: เพราะถ้าคุณเปลี่ยนตัวเลือกที่เลือกของการเลือกด้วย jQuery การเปลี่ยนแปลงจะไม่ถูกทริกเกอร์ดังนั้นจึงจำเป็นต้องใช้ทริกเกอร์ด้วยตนเอง
machineaddict

2
หากคุณต้องการเหตุการณ์การเปลี่ยนแปลงหลังจากเปลี่ยนค่าของดรอปบ็อกซ์คุณต้องเรียกใช้ฟังก์ชันการเปลี่ยนแปลงหลังจากตั้งค่า
tver3305

ฉันต้องการกิจกรรมการเปลี่ยนแปลงเป็นพิเศษเพื่อให้เหตุการณ์นี้เป็นประโยชน์กับฉันมากที่สุด
Rohan

32

เพียงแค่ FYI คุณไม่จำเป็นต้องใช้คลาส CSS เพื่อทำสิ่งนี้ให้สำเร็จ

คุณสามารถเขียนบรรทัดของรหัสต่อไปนี้เพื่อรับชื่อตัวควบคุมที่ถูกต้องบนไคลเอนต์:

$("#<%= statusDDL.ClientID %>").val("2");

ASP.NET จะแสดง ID ควบคุมอย่างถูกต้องภายใน jQuery


8
ใช้งานได้เฉพาะเมื่อจาวาสคริปต์ของคุณอยู่ในมาร์กอัป. aspx หรือ .ascx เท่านั้นและจะไม่ทำงานเมื่ออยู่ในไฟล์. js เช่นเดียวกับที่นี่ นอกจากนี้ขึ้นอยู่กับความลึกของการควบคุมของคุณในแอปพลิเคชันของคุณ (ในกรณีของฉันมันมีความลึกประมาณ 10 ระดับ) ClientID นั้นมีความยาวอย่างไม่น่าเชื่อและสามารถเพิ่ม bloat ขนาดใหญ่ให้กับจาวาสคริปต์ของคุณได้ ฉันพยายามทำให้มาร์กอัปของฉันเล็กที่สุดเท่าที่จะทำได้
phairoh

2
@ y0mbo แต่แม้ว่าคุณจะย้ายไปที่ MVC คุณควรใช้ไฟล์. JS ภายนอกสำหรับ JavaScript ของคุณเพื่อให้เบราว์เซอร์และพร็อกซีเซิร์ฟเวอร์สามารถแคชเพื่อประสิทธิภาพ
7wp

1
@Roberto - แต่ MVC ไม่ได้ใช้หลักการตั้งชื่อโง่ที่ asp.net webforms ทำเพื่อให้คุณสามารถอ้างอิงไฟล์ js ภายนอกกับตัวควบคุมที่คุณต้องการได้อย่างสะดวกสบาย
lloydphillips

6
หากคุณสร้างจาวาสคริปต์สไตล์ OO คุณสามารถส่งรหัสลูกค้าของคุณไปยังตัวสร้างของวัตถุของคุณ รหัสวัตถุทั้งหมดอยู่ในไฟล์ js ภายนอก แต่คุณยกตัวอย่างจากรหัส aspx ของคุณ
mikesigs

1
ฉันจะตั้ง ClientIDMode = "คงที่" บนตัวควบคุม asp เร็ว ๆ นี้เพื่อให้คุณรู้ว่า ID จะเป็น ID ที่คุณระบุ คุณต้องระวังถ้าคุณควบคุมตัวนั้นไว้ในทวน msdn.microsoft.com/en-us/library/…
Shawson


23

วิธีแก้ปัญหาเหล่านี้ดูเหมือนจะสมมติว่าแต่ละรายการในรายการแบบหล่นลงของคุณมีค่าval () ที่เกี่ยวข้องกับตำแหน่งในรายการแบบหล่นลง

สิ่งต่าง ๆ มีความซับซ้อนกว่านี้เล็กน้อยหากไม่เป็นเช่นนั้น

หากต้องการอ่านดัชนีที่เลือกของรายการดรอปดาวน์คุณจะต้องใช้สิ่งนี้:

$("#dropDownList").prop("selectedIndex");

ในการตั้งค่าดัชนีที่เลือกของรายการดรอปดาวน์คุณจะต้องใช้สิ่งนี้:

$("#dropDownList").prop("selectedIndex", 1);

โปรดทราบว่าคุณสมบัติprop ()ต้องใช้ JQuery v1.6 ขึ้นไป

เรามาดูกันว่าคุณจะใช้ฟังก์ชันทั้งสองนี้อย่างไร

สมมติว่าคุณมีรายชื่อเดือนแบบเลื่อนลง

<select id="listOfMonths">
  <option id="JAN">January</option>
  <option id="FEB">February</option>
  <option id="MAR">March</option>
</select>

คุณสามารถเพิ่มปุ่ม "เดือนก่อนหน้า" และ "เดือนถัดไป" ซึ่งจะดูรายการที่เลือกในปัจจุบันและเปลี่ยนเป็นรายการก่อนหน้า / เดือนถัดไป:

<button id="btnPrevMonth" title="Prev" onclick="btnPrevMonth_Click();return false;" />
<button id="btnNextMonth" title="Next" onclick="btnNextMonth_Click();return false;" />

และนี่คือ JavaScript ที่ปุ่มเหล่านี้จะทำงาน:

function btnPrevMonth_Click() {
    var selectedIndex = $("#listOfMonths").prop("selectedIndex");
    if (selectedIndex > 0) {
        $("#listOfMonths").prop("selectedIndex", selectedIndex - 1);
    }
}
function btnNextMonth_Click() {
    //  Note:  the JQuery "prop" function requires JQuery v1.6 or later
    var selectedIndex = $("#listOfMonths").prop("selectedIndex");
    var itemsInDropDownList = $("#listOfMonths option").length;

    //  If we're not already selecting the last item in the drop down list, then increment the SelectedIndex
    if (selectedIndex < (itemsInDropDownList - 1)) {
        $("#listOfMonths").prop("selectedIndex", selectedIndex + 1);
    }
}

ไซต์ต่อไปนี้ยังมีประโยชน์สำหรับการแสดงวิธีการเติมรายการแบบหล่นลงด้วยข้อมูล JSON:

http://mikesknowledgebase.com/pages/Services/WebServices-Page8.htm

ว้า !!

หวังว่านี่จะช่วยได้


20

หลังจากดูวิธีแก้ปัญหาบางอย่างแล้วสิ่งนี้ก็ใช้ได้กับฉัน

ฉันมีรายการแบบหล่นลงหนึ่งรายการที่มีค่าบางอย่างและฉันต้องการเลือกค่าเดียวกันจากรายการแบบหล่นลงอื่น ... ดังนั้นก่อนอื่นฉันใส่ตัวแปรselectIndexของแบบเลื่อนลงครั้งแรกของฉัน

var indiceDatos = $('#myidddl')[0].selectedIndex;

จากนั้นฉันเลือกดัชนีนั้นในรายการดรอปดาวน์ที่สองของฉัน

$('#myidddl2')[0].selectedIndex = indiceDatos;

บันทึก:

ฉันเดาว่านี่เป็นทางออกที่สั้นที่สุดเชื่อถือได้ทั่วไปและหรูหรา

เพราะในกรณีของฉันฉันกำลังใช้แอตทริบิวต์ข้อมูลของตัวเลือกที่เลือกแทนแอตทริบิวต์ค่า ดังนั้นหากคุณไม่มีค่าที่ไม่ซ้ำกันสำหรับแต่ละตัวเลือกวิธีการข้างต้นนั้นสั้นและหวาน !!


5
นี่คือคำตอบที่ถูกต้องและทุกคนที่ไม่ได้พูดว่า 'selectedIndex' ในทันทีควรรู้ดีกว่า Hurray DOM API และคนที่เขียนมันย้อนกลับไปในยุคหิน
vsync

16

ฉันรู้ว่านี่เป็นคำถามเก่าและวิธีการแก้ปัญหาข้างต้นทำงานได้ดียกเว้นในบางกรณี

ชอบ

<select id="select_selector">
<option value="1">Item1</option>
<option value="2">Item2</option>
<option value="3">Item3</option>
<option value="4" selected="selected">Item4</option>
<option value="5">Item5</option>
</select>

ดังนั้นรายการ 4 จะแสดงเป็น "เลือก" ในเบราว์เซอร์และตอนนี้คุณต้องการเปลี่ยนค่าเป็น 3 และแสดง "รายการ 3" ตามที่เลือกแทนรายการที่ 4 ดังนั้นตามวิธีแก้ไขปัญหาข้างต้นหากคุณใช้

jQuery("#select_selector").val(3);

คุณจะเห็นว่ารายการ 3 ตามที่เลือกในเบราว์เซอร์ แต่เมื่อคุณประมวลผลข้อมูลใน php หรือ asp คุณจะพบค่าที่เลือกเป็น "4" เหตุผลก็คือ html ของคุณจะมีลักษณะเช่นนี้

<select id="select_selector">
<option value="1">Item1</option>
<option value="2">Item2</option>
<option value="3" selected="selected">Item3</option>
<option value="4" selected="selected">Item4</option>
<option value="5">Item5</option>
</select>

และได้รับค่าสุดท้ายเป็น "4" ในภาษาด้านที่ตัดกัน

ดังนั้นทางออกสุดท้ายของฉันเกี่ยวกับเรื่องนี้

newselectedIndex = 3;
jQuery("#select_selector option:selected").removeAttr("selected");
jQuery("#select_selector option[value='"+newselectedIndex +"']").attr('selected', 'selected');  

แก้ไข : เพิ่มเครื่องหมายคำพูดเดี่ยวรอบ "+ newselectedIndex +" เพื่อให้สามารถใช้ฟังก์ชันการทำงานเดียวกันสำหรับค่าที่ไม่ใช่ตัวเลขได้

ดังนั้นสิ่งที่ฉันทำคือเอาแอตทริบิวต์ที่เลือกออกแล้วสร้างใหม่ตามที่เลือก

ฉันจะซาบซึ้งความคิดเห็นนี้จากโปรแกรมเมอร์อาวุโสเช่น @strager, @ y0mbo, @ISIK และคนอื่น ๆ


10

หากเรามีรายการแบบหล่นลงพร้อมกับชื่อ "การจำแนกข้อมูล":

<select title="Data Classification">
    <option value="Top Secret">Top Secret</option>
    <option value="Secret">Secret</option>
    <option value="Confidential">Confidential</option>
</select>

เราสามารถทำให้มันเป็นตัวแปร:

var dataClsField = $('select[title="Data Classification"]');

จากนั้นใส่ตัวแปรอื่นที่เราต้องการให้ดรอปดาวน์มี:

var myValue = "Top Secret";  // this would have been "2" in your example

จากนั้นเราสามารถใช้ฟิลด์ที่เราใส่dataClsFieldทำการค้นหาmyValueและทำการเลือกโดยใช้.prop():

dataClsField.find('option[value="'+ myValue +'"]').prop('selected', 'selected');

หรือคุณสามารถใช้.val()แต่ตัวเลือกตัวเลือกของ.คุณสามารถใช้ได้ก็ต่อเมื่อมันตรงกับคลาสในรายการดรอปดาวน์และคุณควรใช้เครื่องหมายคำพูดกับค่าที่อยู่ในวงเล็บหรือใช้ตัวแปรที่เราตั้งไว้ก่อนหน้านี้:

dataClsField.val(myValue);

4

ดังนั้นฉันจึงเปลี่ยนมันเพื่อให้ตอนนี้มันทำงานหลังจาก 300 มิลลิวินาทีโดยใช้ setTimeout ดูเหมือนว่าจะทำงานตอนนี้

ฉันพบปัญหานี้หลายครั้งเมื่อโหลดข้อมูลจากการโทร Ajax ฉันใช้. NET ด้วยและต้องใช้เวลาในการปรับให้เป็นรหัสลูกค้าเมื่อใช้ตัวเลือก jQuery ในการแก้ไขปัญหาที่คุณมีและเพื่อหลีกเลี่ยงการเพิ่มsetTimeoutคุณสมบัติคุณสามารถใส่ " async: false" ในการเรียก Ajax และมันจะให้เวลา DOM พอที่จะให้วัตถุกลับมาที่คุณเพิ่มในการเลือก ตัวอย่างเล็ก ๆ ด้านล่าง:

$.ajax({
    type: "POST",
    url: document.URL + '/PageList',
    data: "{}",
    async: false,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function (response) {
        var pages = (typeof response.d) == 'string' ? eval('(' + response.d + ')') : response.d;

        $('#locPage' + locId).find('option').remove();

        $.each(pages, function () {
            $('#locPage' + locId).append(
                $('<option></option>').val(this.PageId).html(this.Name)
            );
        });
    }
});

3

เพิ่งทราบ - ฉันใช้ตัวเลือกตัวแทนใน jQuery เพื่อคว้ารายการที่ obfuscated โดย ASP.NET CLient IDs - สิ่งนี้อาจช่วยคุณได้เช่นกัน:

<asp:DropDownList id="MyDropDown" runat="server" />

$("[id* = 'MyDropDown']").append("<option value='-1'>&nbsp;</option>"); //etc

หมายเหตุ id * wildcard- สิ่งนี้จะค้นหาองค์ประกอบของคุณแม้ว่าชื่อจะเป็น "ctl00 $ ctl00 $ ContentPlaceHolder1 $ ContentPlaceHolder1 $ MyDropDown"


3

ฉันใช้ฟังก์ชั่นขยายเพื่อรับรหัสลูกค้าเช่น:

$.extend({
    clientID: function(id) {
        return $("[id$='" + id + "']");
    }
});

จากนั้นคุณสามารถเรียกใช้ตัวควบคุม ASP.NET ใน jQuery เช่นนี้

$.clientID("_statusDDL")

3

อีกตัวเลือกหนึ่งคือการตั้งค่าพารามิเตอร์การควบคุม ClientID = "คงที่" ใน. net จากนั้นคุณสามารถเข้าถึงวัตถุใน JQuery ด้วย ID ที่คุณตั้งไว้


3
<asp:DropDownList id="MyDropDown" runat="server" />

$("select[name$='MyDropDown']").val()ใช้


หากคุณกำลังจับคู่ชื่อคุณอาจจะต้องลบชื่อ$นั้นด้วยซึ่งจะเป็นการจับคู่แบบเต็มไม่ใช่ 'ลงท้ายด้วย' แต่ข้อเสนอแนะของคุณอาจเร็วกว่าการจับคู่ในชื่อคลาสเท่านั้น ได้เร็วยิ่งขึ้นแม้ว่าจะเป็นหรือelement.classname #idname
Alec

2

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

หากคุณใช้วิธี Ajax ของ jQuery คุณสามารถระบุฟังก์ชั่นการโทรกลับแล้วใส่$("._statusDDL").val(2);ลงในฟังก์ชั่นการโทรกลับ

นี่จะเป็นวิธีการจัดการปัญหาที่เชื่อถือได้มากขึ้นเนื่องจากคุณสามารถมั่นใจได้ว่าวิธีการดำเนินการเมื่อข้อมูลพร้อมแม้ว่าจะใช้เวลานานกว่า 300 ms


2
<asp:DropDownList ID="DropUserType" ClientIDMode="Static" runat="server">
     <asp:ListItem Value="1" Text="aaa"></asp:ListItem>
     <asp:ListItem Value="2" Text="bbb"></asp:ListItem>
</asp:DropDownList>

ClientIDMode = "คงที่"

$('#DropUserType').val('1');

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