Làm cách nào để có được tất cả các tùy chọn của một lựa chọn bằng jQuery?


406

Làm cách nào tôi có thể nhận được tất cả các tùy chọn của một lựa chọn thông qua jQuery bằng cách chuyển ID của nó?

Tôi chỉ tìm kiếm để có được giá trị của họ, không phải là văn bản.

Câu trả lời:


612

Sử dụng:

$("#id option").each(function()
{
    // Add $(this).val() to your list
});

.each () | Tài liệu API jQuery


63
Không có thao tác JavaScript nào yêu cầu jQuery. jQuery là một vấn đề được lựa chọn để đơn giản hóa các hoạt động JS.
ruuter

8
bạn cũng có thể làm: $ ("# id tùy chọn"). Each (function (name, val) {var opt = val.text;});
kofifus

3
$.mapthanh lịch hơn và ít bị lỗi hơn (xem bên dưới).
Elliot Cameron

1
$('#id option').map((index, option) => option.value): lưu ý cách chữ ký gọi lại được đảo ngược so với maphàm JS "vanilla" ( (item, index) =>)
imrok

168

Tôi không biết jQuery, nhưng tôi biết rằng nếu bạn lấy phần tử select, nó chứa đối tượng 'tùy chọn'.

var myOpts = document.getElementById('yourselect').options;
alert(myOpts[0].value) //=> Value of the first option

74
+1. Đừng dùng đến ma thuật chọn phức tạp của jQuery cho những thứ đã triển khai khá hiệu quả được tích hợp trong DOM cũ đơn giản.
bobince

19
Tại sao không, @bobince? Nếu bạn chủ yếu sử dụng jQuery thì sẽ nhanh hơn cả khi viết ít mã hơn và nhanh hơn để không thử và tìm hiểu xem bạn có nên chuyển sang javascript thông thường trong trường hợp này không. Và mã của bạn phù hợp hơn.
Andrew

139

$.map có lẽ là cách hiệu quả nhất để làm điều này

var options = $('#selectBox option');

var values = $.map(options ,function(option) {
    return option.value;
});

Bạn có thể thêm các tùy chọn thay đổi $('#selectBox option:selected')nếu bạn chỉ muốn những tùy chọn được chọn.

Dòng đầu tiên chọn tất cả các hộp kiểm và đặt phần tử jQuery của chúng vào một biến. Sau đó, chúng tôi sử dụng .mapchức năng của jQuery để áp dụng một hàm cho từng thành phần của biến đó; tất cả những gì chúng tôi đang làm là trả lại giá trị của từng yếu tố vì đó là tất cả những gì chúng tôi quan tâm. Bởi vì chúng tôi đang trả lại chúng bên trong chức năng bản đồ, nó thực sự xây dựng một mảng các giá trị theo yêu cầu.


3
Đây là giải pháp IMO thanh lịch nhất. Bản đồ là một cấu trúc rất mạnh phù hợp với chính xác tình huống này.
hazerd

1
Tôi thực sự thích giải pháp của bạn - đó là cách tiếp cận tôi đã thực hiện. Tuy nhiên, nếu bạn chỉ muốn các giá trị được chọn, nó thậm chí còn tầm thường hơn: $('#selectBox').val()sẽ trả về một mảng các giá trị được chọn.
whoisthemachine 11/2/2015

Xin chào, @PCasagrande Tôi có tên thuộc tính tùy chỉnh 'kiểu dữ liệu'. Làm thế nào tôi có thể nhận được giá trị của điều này bằng cách sử dụng giải pháp của bạn? Những gì tôi đang làm là 'tùy chọn.data-type', nhưng điều này mang lại cho tôi NaN. Cảm ơn trước.
Me_developer

Xin chào, @PCasagrande Tôi đã nhận được những gì tôi cần bằng cách thực hiện '$ (tùy chọn, cái này) .attr ("kiểu dữ liệu")'. Nhưng nếu bạn có bất cứ điều gì tốt hơn thì hãy cho tôi biết. Cảm ơn. :)
Me_developer

Tôi nghĩ bạn chỉ có thể thực hiện 'return option.attr ("kiểu dữ liệu");' trong bản đồ. Điều đó sẽ cung cấp cho bạn một mảng các giá trị của kiểu dữ liệu.
PCasagrande

74

Một số câu trả lời sử dụng each, nhưng maplà một thay thế tốt hơn ở đây IMHO:

$("select#example option").map(function() {return $(this).val();}).get();

Có (ít nhất) hai maphàm trong jQuery. Câu trả lời của Thomas Petersen sử dụng "Tiện ích / jQuery.map"; câu trả lời này sử dụng "Traversing / map" (và do đó mã sạch hơn một chút).

Nó phụ thuộc vào những gì bạn sẽ làm với các giá trị. Nếu bạn, giả sử, muốn trả về các giá trị từ một hàm, mapcó lẽ là sự thay thế tốt hơn. Nhưng nếu bạn sẽ sử dụng các giá trị trực tiếp, bạn có thể muốn each.


4
Bạn thực sự có thể sử dụng this.value thay vì $ (this) .val () tại đây. Bạn cũng sẽ được phục vụ tốt hơn bằng cách tìm trẻ em trong bộ chọn ban đầu (tùy chọn #example). Đẹp khó khăn với get () ở cuối mặc dù.
Alex Barrett

1
@Alex Barret: Vâng, có thể giải quyết vấn đề này mà không cần sử dụng jQuery. Gọi jQuery với một phần tử là đối số sẽ chỉ bao bọc phần tử trong một đối tượng jQuery (nghĩa là không có cây nào đi qua, tức là không đắt lắm). Vì vậy, có thể là một tối ưu hóa vi mô, có.
cic

bản đồ FTW. Đây chính xác là cách nó nên được thực hiện. Tuy nhiên, get () ở cuối dường như không cần thiết (trả về nút DOM và val () đã cung cấp cho chúng ta một chuỗi, vì vậy ...?) Var opts = $ ('# cm_amt tùy chọn'). Map (function (function (function (function) ) {return parseInt ($ (this) .val ());});
sbeam

3
@sbeam: "Vì giá trị trả về là một mảng được bao bọc bởi jQuery, nên nó rất phổ biến get()đối tượng được trả về để làm việc với một mảng cơ bản." - api.jquery.com/map
cic

Nó giúp tôi rất nhiều, tôi muốn văn bản không phải là giá trị, vì vậy tôi chỉ thay đổi để text()thay thế val(). Cảm ơn bạn ! (Tôi đã khiến bạn vượt quá 1000 ;->)
ParPar

52
$('select#id').find('option').each(function() {
    alert($(this).val());
});

1
Đây là vé, vì tôi thích lưu các phần tử vào các biến trên init, hơn là sử dụng bộ chọn.
Râu Doug

1
Cũng hoạt động với $ (cái này) (đó là thứ đang tìm kiếm), vd,
Hugh Seagraves

16
$("#id option").each(function()
{
    $(this).prop('selected', true);
});

Mặc dù, cách ĐÚNG là đặt thuộc tính DOM của phần tử, như vậy:

$("#id option").each(function(){
    $(this).attr('selected', true);
});

4
Nó sẽ không phải là .attr ('được chọn', 'được chọn') chứ?
v010dya

16

Điều này sẽ đặt các giá trị tùy chọn #myselectboxthành một mảng sạch đẹp cho bạn:

// First, get the elements into a list
var domelts = $('#myselectbox option');

// Next, translate that into an array of just the values
var values = $.map(domelts, function(elt, i) { return $(elt).val();});

Bạn có thể rút ngắn điều này thành:$.map(domelts, elt=> $(elt).val())
Jonno_FTW

11

Bạn có thể lấy tất cả "giá trị đã chọn" của mình theo tên của các hộp kiểm và trình bày chúng trong một sting cách nhau bởi ",".

Một cách hay để làm điều này là sử dụng $ .map ():

var selected_val = $.map($("input[name='d_name']:checked"), function(a)
    {
        return a.value;
    }).join(',');

alert(selected_val);

6
mã này khá khó đọc, tôi sẽ không bao giờ sử dụng nó ngay cả khi nó khá tuyệt.
Nhấp vào Upvote

7
câu hỏi là về selectoptionkhông phải là hộp kiểm.
Mất trí nhớ


3

Bạn có thể sử dụng mã sau đây cho điều đó:

var assignedRoleId = new Array();
$('#RolesListAssigned option').each(function(){
    assignedRoleId.push(this.value);
});

2

Đối với tùy chọn đa lựa chọn:

$('#test').val()trả về danh sách các giá trị được chọn. $('#test option').lengthtrả về tổng số tùy chọn (cả được chọn và không được chọn)


1

Đây là một Script đơn giản với jQuery:

var items = $("#IDSELECT > option").map(function() {
    var opt = {};
    opt[$(this).val()] = $(this).text();
    return opt;
}).get();
var selectvalues = [];

for(var i = 0; i < items.length; i++) {
    for(key in items[i]) {


        var id = key;
        var text = items[i][key];

        item = {}
        item ["id"] = id;
        item ["text"] = text;

        selectvalues.push(item);

    }
}
console.log(selectvalues);
copy(selectvalues);
<select>
  <option value="volvo">Volvo</option>
  <option value="saab">Saab</option>
  <option value="mercedes">Mercedes</option>
  <option value="audi">Audi</option>
</select>

1

Dưới đây là một ví dụ đơn giản trong jquery để lấy tất cả các giá trị, văn bản hoặc giá trị của mục đã chọn hoặc văn bản của mục đã chọn

$('#nCS1 > option').each((index, obj) => {
   console.log($(obj).val());
})

printOptionValues = () => {

  $('#nCS1 > option').each((index, obj) => {
    console.log($(obj).val());
  })

}

printOptionTexts = () => {
  $('#nCS1 > option').each((index, obj) => {
    console.log($(obj).text());
  })
}

printSelectedItemText = () => {
  console.log($('#nCS1 option:selected').text());
}

printSelectedItemValue = () => {
  console.log($('#nCS1 option:selected').val());
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select size="1" id="nCS1" name="nCS1" class="form-control" >
					<option value="22">Australia</option>
          <option value="23">Brunei</option>
          <option value="33">Cambodia</option>
          <option value="32">Canada</option>
          <option value="27">Dubai</option>
          <option value="28">Indonesia</option>
          <option value="25">Malaysia</option>				
</select>
<br/>
<input type='button' onclick='printOptionValues()' value='print option values' />
<br/>
<input type='button' onclick='printOptionTexts()' value='print option texts' />
<br/>
<input type='button' onclick='printSelectedItemText()' value='print selected option text'/>
<br/>
<input type='button' onclick='printSelectedItemValue()' value='print selected option value' />


0
$("input[type=checkbox][checked]").serializeArray();

Hoặc là:

$(".some_class[type=checkbox][checked]").serializeArray();

Để xem kết quả:

alert($("input[type=checkbox][checked]").serializeArray().toSource());

0

Nếu bạn đang tìm kiếm tất cả các tùy chọn với một số văn bản đã chọn thì đoạn mã dưới đây sẽ hoạt động.

$('#test').find("select option:contains('B')").filter(":selected");

0

Con đường ngắn

$(() => {
$('#myselect option').each((index, data) => {
    console.log(data.attributes.value.value)
})})

hoặc là

export function GetSelectValues(id) {
const mData = document.getElementById(id);
let arry = [];
for (let index = 0; index < mData.children.length; index++) {
    arry.push(mData.children[index].value);
}
return arry;}
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.