Thêm dữ liệu bổ sung để chọn tùy chọn bằng jQuery


139

Câu hỏi rất đơn giản tôi hy vọng.

Tôi có <select>hộp thông thường như thế này

<select id="select">
    <option value="1">this</option>
    <option value="2">that</option>
    <option value="3">other</option>
</select>

Tôi có thể nhận giá trị đã chọn (bằng cách sử dụng $("#select").val()) và giá trị hiển thị của mục đã chọn (bằng cách sử dụng $("#select :selected").text().

Nhưng làm thế nào tôi có thể lưu trữ như một giá trị bổ sung trong <option>thẻ? Tôi muốn có thể làm một cái gì đó như <option value="3.1" value2="3.2">other</option>và nhận giá trị của value2thuộc tính (trong ví dụ này là 3,2).


Bạn muốn thêm một mục vào hộp chọn? hoặc bạn muốn có thể chọn nhiều hơn một lần và nhận được kết quả?
zsalzbank

không, tôi chỉ đơn giản muốn có một giá trị2 = "" trong thẻ <tùy chọn>, nhưng điều đó không hiệu quả
jim smith

Câu hỏi của bạn không rõ ràng (với tôi, dù sao đi nữa). Bạn có ý nghĩa gì khi "lưu trữ một giá trị khác trong các tùy chọn được chọn"? Bạn có nghĩa là bạn muốn thêm một tùy chọn mới vào lựa chọn, nó sẽ xuất hiện cho người dùng khi mở?
Phrogz

15
không bất chấp logic hay lý do, trời ạ. Tôi có một câu hỏi / trường hợp tương tự vì vậy tôi có thể so sánh các giá trị giữa các lựa chọn và lưu văn bản của các tùy chọn của một người vào các tùy chọn của người khác trong khi duy trì các giá trị / văn bản của lựa chọn đó, một cách có thể là thông qua dữ liệu như câu trả lời dưới đây. chỉ vì BẠN không nghĩ về điều đó không có nghĩa là nó bất chấp logic và lý trí. OP là một câu hỏi đủ tốt, anh ta chỉ cần chỉ đúng hướng, không nhận được một ly lớn.
dùng1783229

1
bạn luôn có thể thêm bất kỳ số lượng tham số bổ sung nào bằng cách sử dụng dữ liệu-mọi thứ và sử dụng .data ('mọi thứ') bất cứ nơi nào bạn sẽ làm .value nếu không. chỉ cần trao đổi bất cứ thứ gì cho value2 hoặc tương tự như ý thích của bạn

Câu trả lời:


320

Đánh dấu HTML

<select id="select">
  <option value="1" data-foo="dogs">this</option>
  <option value="2" data-foo="cats">that</option>
  <option value="3" data-foo="gerbils">other</option>
</select>

// JavaScript using jQuery
$(function(){
    $('select').change(function(){
       var selected = $(this).find('option:selected');
       var extra = selected.data('foo'); 
       ...
    });
});

// Plain old JavaScript
var sel = document.getElementById('select');
var selected = sel.options[sel.selectedIndex];
var extra = selected.getAttribute('data-foo');

Xem đây là một mẫu làm việc bằng cách sử dụng jQuery tại đây: http://jsfiddle.net/GsdCj/1/
Xem đây là một mẫu làm việc bằng cách sử dụng JavaScript đơn giản tại đây: http://jsfiddle.net/GsdCj/2/

Bằng cách sử dụng các thuộc tính dữ liệu từ HTML5, bạn có thể thêm dữ liệu bổ sung vào các phần tử theo cách hợp lệ về mặt cú pháp cũng có thể dễ dàng truy cập từ jQuery.


@jimsmith Vâng, nó sẽ. (Nếu bạn tìm thấy bất kỳ của những câu trả lời hữu ích, bạn nên bỏ phiếu cho họ lên Bạn cũng nên đánh dấu một là "chấp nhận" nếu bạn phát hiện ra rằng nó tốt nhất giải quyết vấn đề của bạn..)
Phrogz

1
Gì? Không, nó sẽ không. Nó sẽ hoạt động trong tất cả các trình duyệt hỗ trợ các thuộc tính dữ liệu HTML5.
glomad

13
@ithcy Tất cả các trình duyệt hỗ trợ (và có hơn 10 năm) các thuộc tính "không hợp lệ" trong đánh dấu và nhận / cài đặt các thuộc tính này thông qua DOM. Các thuộc tính "dữ liệu" HTML5 chỉ là các thuộc tính tùy chỉnh với sơ đồ đặt tên và một tiêu chuẩn mới tuyên bố chúng là hợp pháp.
Phrogz

@Phrogz Tôi biết điều này. Đây không phải là vấn đề trình duyệt "hỗ trợ" các thuộc tính không hợp lệ, mà là vấn đề bỏ qua chúng. Thực sự không có cách nào khác để viết một trình duyệt web có thể sử dụng :) Tuy nhiên tôi nghĩ rằng việc gọi các thuộc tính dữ liệu là "hợp lệ về mặt cú pháp" - nó phụ thuộc vào ngữ cảnh của bạn. Nếu bạn có một loại tài liệu HTML5, thì có, chúng hợp lệ. Nếu không, chúng không và sẽ khiến xác nhận W3C không thành công.
glomad

@ithcy Các trình duyệt 'bỏ qua' chúng trong chừng mực vì chúng không có gì đặc biệt với chúng, nhưng chúng không bỏ qua chúng trong chừng mực vì chúng hoàn toàn có sẵn getAttribute(). Tôi đã trả lời khiếu nại ban đầu của bạn rằng câu trả lời của tôi sẽ không hoạt động trong tất cả các trình duyệt. Tôi đứng trước tuyên bố của mình rằng nó sẽ hoạt động trong 'tất cả các trình duyệt (đối với định nghĩa khá hào phóng về' tất cả 'trong trường hợp này). Chỉ cho tôi một trình duyệt hỗ trợ jQuery nhưng không hoạt động với các thuộc tính dữ liệu này - ngay cả với loại tài liệu không phải là HTML5 - và tôi sẽ ăn lời của mình.
Phrogz

5

Đối với tôi, có vẻ như bạn muốn tạo một thuộc tính mới? Bạn có muốn

<option value="2" value2="somethingElse">...

Để làm điều này, bạn có thể làm

$(your selector).attr('value2', 'the value');

Và sau đó để lấy nó, bạn có thể sử dụng

$(your selector).attr('value2')

Nó sẽ không phải là mã hợp lệ, nhưng tôi đoán nó thực hiện công việc.


Phương pháp khác là sử dụng $ (bộ chọn) .data ('value2', "your value") và $ (bộ chọn) .data ('value2') để truy xuất ... vẫn còn hiệu lực.
mikeir87

Chà, sẽ không hợp lệ về mặt cú pháp khi có các thuộc tính không chuẩn trong đánh dấu ban đầu, nhưng a) Tôi chưa bao giờ thấy bất kỳ trình duyệt nào kể từ thời NS4 có bất kỳ vấn đề nào với điều này và b) nếu bạn có thể sửa đổi DOM để sản xuất một cái gì đó là "không hợp lệ về mặt cú pháp", nó thực sự?
Phrogz

vâng, nó thực sự ... không hợp lệ. tại sao sử dụng các thuộc tính tùy ý khi các thuộc tính data- * đã được xác định trong tiêu chuẩn html5.
stephenbayer

3
Như @stephenbayer đề cập ... cách chính xác để thực hiện việc này bây giờ là sử dụng các thuộc tính data- * được hỗ trợ html5. Những thuộc tính đó không thực sự xung quanh / sử dụng nhiều khi được trả lời ban đầu vào năm 2010 :)
mikeir87


-1

Đánh dấu HTML / JSP:

<form:option 
data-libelle="${compte.libelleCompte}" 
data-raison="${compte.libelleSociale}"   data-rib="${compte.numeroCompte}"                              <c:out value="${compte.libelleCompte} *MAD*"/>
</form:option>

MÃ SỐ YÊU CẦU: Sự kiện: thay đổi

var $this = $(this);
var $selectedOption = $this.find('option:selected');
var libelle = $selectedOption.data('libelle');

Để có một phần tử libelle.val () hoặc libelle.text ()


<form: tùy chọn data-libelle-compte = "$ {compte.libelle} data-raison =" $ {compte.raison} "data-compte =" $ {compte.numero} "> <c: out value =" $ {compte.libelleCompte} MAD "/> </ form: tùy chọn>
Fadid

-4

Để lưu trữ giá trị khác trong các tùy chọn chọn:

$("#select").append('<option value="4">another</option>')
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.