Thay đổi giá trị được chọn của danh sách thả xuống với jQuery


840

Tôi có một danh sách thả xuống với các giá trị đã biết. Những gì tôi đang cố gắng làm là đặt danh sách thả xuống thành một giá trị cụ thể mà tôi biết tồn tại bằng jQuery . Sử dụng JavaScript thông thường , tôi sẽ làm một cái gì đó như:

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

Tuy nhiên, tôi cần phải làm điều này với jQuery , vì tôi đang sử dụng một lớp CSS cho bộ chọn của mình ( id máy khách ASP.NET ngu ngốc ...).

Dưới đây là một vài điều tôi đã thử:

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

Làm thế nào tôi có thể làm điều đó với jQuery ?


Cập nhật

Vì vậy, khi nó bật ra, tôi đã có nó ngay lần đầu tiên với:

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

Khi tôi đặt một cảnh báo ngay phía trên nó hoạt động tốt, nhưng khi tôi loại bỏ cảnh báo và để nó chạy ở tốc độ tối đa, tôi gặp lỗi

Không thể đặt thuộc tính được chọn. Chỉ mục không hợp lệ

Tôi không chắc đó là lỗi với jQuery hay Internet Explorer 6 (Tôi đoán Internet Explorer 6 ), nhưng nó cực kỳ khó chịu.


21
Vấn đề ở đây đã trở thành một vấn đề với IE6. Tôi đã tạo các phần tử tùy chọn mới cho phần tử chọn và sau đó cố gắng đặt giá trị thành một trong các phần tử tùy chọn mới được tạo. IE6 chờ đợi không chính xác cho đến khi nó lấy lại quyền kiểm soát từ tập lệnh để thực sự tạo ra các phần tử mới trong DOM nên tôi đã cố gắng đặt danh sách thả xuống thành các tùy chọn chưa tồn tại, mặc dù chúng nên có.
phairoh

bạn có thể sử dụng javascript thuần túydd1 = document.getElementsByClassName('classname here'); dd1.value = 2;
user2144406

Câu trả lời:


1008

Tài liệu của jQuery nêu rõ:

[jQuery.val] kiểm tra hoặc chọn , tất cả các nút radio, hộp kiểm và chọn tùy chọn khớp với bộ giá trị.

Hành vi này là trong jQuerycác phiên bản 1.2và ở trên.

Bạn rất có thể muốn điều này:

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

22
Điều này có hoạt động nếu selectđược ẩn ( display: none;)? Tôi không thể làm cho nó hoạt động đúng ...
Padel

11
Điều này chỉ giúp tôi tiết kiệm từ việc viết những thứ như $('._statusDDL [value="2"]').attr('selected',true);Cảm ơn!
Basil

6
@Nordes đó sẽ là trường hợp nếu nhận được giá trị được chọn. Trong trường hợp này, nó đang đặt giá trị được chọn, hoặc chính xác hơn là đặt tùy chọn đã chọn.
Jon P

107
@JL: Bạn cần thêm .change()để xem tùy chọn trong giao diện danh sách thả xuống, tức là$('#myID').val(3).change();
Kai Noack

10
Xâu chuỗi .change () nên được thêm vào câu trả lời. Tôi nghĩ rằng tôi sẽ phát điên với giải pháp này không hoạt động cho đến khi tôi đọc qua các ý kiến.
David Baucum

139

Với trường ẩn bạn cần sử dụng như thế này:

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

hoặc là

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

Bạn có thể giải thích lý do tại sao bạn cần thực hiện thay đổi sự kiện cho các trường ẩn?
Samuel

1
@Samuel: bởi vì nếu bạn thay đổi tùy chọn đã chọn bằng jQuery, thay đổi sẽ không được kích hoạt, do đó bắt buộc phải kích hoạt thủ công.
máy móc

2
Nếu bạn cần một sự kiện thay đổi kích hoạt sau khi thay đổi giá trị của dropbox, bạn cần gọi hàm thay đổi sau khi đặt giá trị.
tver3305

Tôi đặc biệt cần sự kiện thay đổi để khai hỏa vì vậy điều này hữu ích nhất với tôi
Rohan

32

Chỉ là một FYI, bạn không cần sử dụng các lớp CSS để thực hiện điều này.

Bạn có thể viết dòng mã sau đây để có được tên điều khiển chính xác trên máy khách:

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

ASP.NET sẽ kết xuất ID điều khiển chính xác bên trong jQuery.


8
Điều đó chỉ hoạt động khi javascript của bạn nằm trong phần đánh dấu .aspx hoặc .ascx chứ không phải khi nó nằm trong tệp .js như trường hợp ở đây. Ngoài ra, tùy thuộc vào mức độ kiểm soát của bạn được lồng trong ứng dụng của bạn (trong trường hợp của tôi, chúng sâu khoảng 10 cấp), ClientID có thể cực kỳ dài và thực sự có thể thêm sự phình to đáng kể vào kích thước javascript của bạn nếu được sử dụng quá tự do. Tôi cố gắng giữ đánh dấu của mình càng nhỏ càng tốt, nếu tôi có thể.
phairoh

2
@ y0mbo Nhưng ngay cả khi bạn chuyển sang MVC, bạn vẫn nên sử dụng các tệp .JS bên ngoài cho JavaScript của mình để trình duyệt và máy chủ proxy có thể lưu trữ bộ đệm cho hiệu suất.
7wp

1
@Roberto - nhưng MVC không sử dụng các quy ước đặt tên ngu ngốc mà các biểu mẫu web asp.net thực hiện để bạn có thể thoải mái tham chiếu trong tệp js bên ngoài tới các điều khiển bạn cần.
lloydphillips

6
Nếu bạn tạo javascript theo kiểu OO, bạn có thể chuyển Id khách hàng của mình vào hàm tạo của đối tượng. Tất cả các mã đối tượng được chứa trong một tệp js bên ngoài, nhưng bạn khởi tạo nó từ mã aspx của bạn.
mikeigs

1
Tôi sẽ sớm đặt ClientIDMode = "Tĩnh" trên các điều khiển asp để bạn biết ID sẽ là ID bạn đã chỉ định. Bạn phải cẩn thận nếu sau đó bạn đặt điều khiển đó vào một bộ lặp. msdn.microsoft.com/en-us/l
Library / từ

25

Chỉ cần thử với

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

và không phải với

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

23

Các giải pháp này dường như giả định rằng mỗi mục trong danh sách thả xuống của bạn có giá trị val () liên quan đến vị trí của chúng trong danh sách thả xuống.

Mọi thứ phức tạp hơn một chút nếu đây không phải là trường hợp.

Để đọc chỉ mục được chọn của danh sách thả xuống, bạn sẽ sử dụng:

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

Để đặt chỉ mục đã chọn của danh sách thả xuống, bạn sẽ sử dụng:

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

Lưu ý rằng tính năng prop () yêu cầu JQuery v1.6 trở lên.

Hãy xem cách bạn sẽ sử dụng hai chức năng này.

Giả sử bạn có một danh sách tên tháng.

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

Bạn có thể thêm nút "Tháng trước" và "Tháng tiếp theo", xem mục danh sách thả xuống hiện đang được chọn và thay đổi nó thành tháng trước / tháng tiếp theo:

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

Và đây là JavaScript mà các nút này sẽ chạy:

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

Trang web sau đây cũng hữu ích, để hiển thị cách điền danh sách thả xuống với dữ liệu JSON:

http://mikeledgeledridease.com/pages/Service/WebService-Page8.htm

Phù !!

Hi vọng điêu nay co ich.


20

Sau khi xem xét một số giải pháp, điều này làm việc cho tôi.

Tôi có một danh sách thả xuống với một số giá trị và tôi muốn chọn cùng một giá trị từ danh sách thả xuống khác ... Vì vậy, trước tiên tôi đặt vào một biến selectIndex thả xuống đầu tiên của mình.

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

Sau đó, tôi chọn chỉ mục đó trong danh sách thả xuống thứ hai của mình.

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

Ghi chú:

Tôi đoán đây là giải pháp ngắn nhất, đáng tin cậy, chung chung và thanh lịch.

Bởi vì trong trường hợp của tôi, tôi đang sử dụng thuộc tính dữ liệu của tùy chọn đã chọn thay vì thuộc tính value. Vì vậy, nếu bạn không có giá trị duy nhất cho mỗi tùy chọn, phương pháp trên là ngắn nhất và ngọt ngào !!


5
Đây là câu trả lời chính xác và tất cả những người không nói 'chọn Index' ngay lập tức, nên biết rõ hơn. API Hurrah và những người đã viết lại nó trong thời kỳ đồ đá.
vsync

16

Tôi biết đây là một câu hỏi cũ và các giải pháp trên hoạt động tốt, ngoại trừ trong một số trường hợp.

Giống

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

Vì vậy, Mục 4 sẽ hiển thị là "Đã chọn" trong trình duyệt và bây giờ bạn muốn thay đổi giá trị là 3 và hiển thị "Mục 3" như đã chọn thay vì Mục 4. Theo các giải pháp trên, nếu bạn sử dụng

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

Bạn sẽ thấy Mục 3 như được chọn trong trình duyệt. Nhưng khi bạn xử lý dữ liệu bằng php hoặc asp, bạn sẽ tìm thấy giá trị được chọn là "4". Lý do là, html của bạn sẽ như thế này.

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

và nó nhận giá trị cuối cùng là "4" trong ngôn ngữ bên sever.

VÌ GIẢI PHÁP CUỐI CÙNG CỦA TÔI VỀ BAN NÀY

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

BIÊN TẬP : Thêm một trích dẫn xung quanh "+ newselected Index +" để có thể sử dụng cùng chức năng cho các giá trị không phải là số.

Vì vậy, những gì tôi làm là thực sự, loại bỏ thuộc tính được chọn và sau đó làm cho thuộc tính mới như đã chọn.

Tôi sẽ đánh giá cao ý kiến ​​về điều này từ các lập trình viên cao cấp như @strager, @ y0mbo, @ISIK và những người khác


10

Nếu chúng tôi có danh sách thả xuống với tiêu đề "Phân loại dữ liệu":

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

Chúng ta có thể biến nó thành một biến:

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

Sau đó đưa vào một biến khác giá trị mà chúng ta muốn thả xuống có:

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

Sau đó, chúng tôi có thể sử dụng trường chúng tôi đưa vào dataClsField, tìm kiếm myValuevà chọn nó bằng cách sử dụng .prop():

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

Hoặc, bạn chỉ có thể sử dụng .val(), nhưng bộ chọn của .bạn chỉ có thể được sử dụng nếu nó phù hợp với một lớp trên danh sách thả xuống và bạn nên sử dụng dấu ngoặc kép trên giá trị bên trong dấu ngoặc đơn hoặc chỉ sử dụng biến chúng ta đã đặt trước đó:

dataClsField.val(myValue);

4

Vì vậy, tôi đã thay đổi nó để bây giờ nó thực thi sau 300 triệu giây sử dụng setTimeout. Có vẻ như đang làm việc bây giờ.

Tôi đã gặp phải điều này nhiều lần khi tải dữ liệu từ một cuộc gọi Ajax. Tôi cũng sử dụng .NET và cần có thời gian để điều chỉnh clientId khi sử dụng bộ chọn jQuery. Để khắc phục sự cố mà bạn gặp phải và để tránh phải thêm thuộc setTimeouttính, bạn chỉ cần đặt " async: false" trong lệnh gọi Ajax và nó sẽ cung cấp cho DOM đủ thời gian để đưa các đối tượng trở lại mà bạn đang thêm vào lựa chọn. Một mẫu nhỏ dưới đây:

$.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

Chỉ là một lưu ý - Tôi đã sử dụng các bộ chọn ký tự đại diện trong jQuery để lấy các mục bị ẩn bởi ID ASP.NET CLient - điều này cũng có thể giúp bạn:

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

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

Lưu ý id * wildcard- cái này sẽ tìm thấy phần tử của bạn ngay cả khi tên đó là "ctl00 $ ctl00 $ ContentPlaceHolder1 $ ContentPlaceHolder1 $ MyDropDown"


3

Tôi sử dụng chức năng mở rộng để lấy id khách hàng, như vậy:

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

Sau đó, bạn có thể gọi các điều khiển ASP.NET trong jQuery như thế này:

$.clientID("_statusDDL")

3

Một tùy chọn khác là đặt điều khiển param ClientID = "Tĩnh" trong .net và sau đó bạn có thể truy cập đối tượng trong JQuery bằng ID bạn đặt.


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

Sử dụng $("select[name$='MyDropDown']").val().


Nếu bạn khớp với tên, bạn cũng có thể xóa tên $đó để khớp hoàn toàn, không phải là 'kết thúc bằng'. Nhưng đề xuất của bạn có thể nhanh hơn so với chỉ khớp với tên lớp. Thậm chí nhanh hơn sẽ là element.classnamehoặc #idname.
Alec

2

Làm thế nào để bạn tải các giá trị vào danh sách thả xuống hoặc xác định giá trị nào sẽ chọn? Nếu bạn đang thực hiện việc này bằng Ajax, thì lý do bạn cần độ trễ trước khi lựa chọn xảy ra có thể là do các giá trị không được tải vào thời điểm mà dòng trong câu hỏi được thực thi. Điều này cũng sẽ giải thích lý do tại sao nó hoạt động khi bạn đặt một cảnh báo trên dòng trước khi đặt trạng thái vì hành động cảnh báo sẽ cung cấp đủ độ trễ cho dữ liệu tải.

Nếu bạn đang sử dụng một trong các phương thức Ajax của jQuery, bạn có thể chỉ định hàm gọi lại và sau đó đưa $("._statusDDL").val(2);vào hàm gọi lại.

Đây sẽ là một cách đáng tin cậy hơn để xử lý vấn đề vì bạn có thể chắc chắn rằng phương thức được thực thi khi dữ liệu đã sẵn sàng, ngay cả khi mất nhiều thời gian hơn 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 = "Tĩnh"

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

1

Trong trường hợp của tôi, tôi đã có thể làm cho nó hoạt động bằng phương thức .attr ().

$("._statusDDL").attr("selected", "");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.