Khi chọn thay đổi, nhận giá trị thuộc tính dữ liệu


273

Đoạn mã sau trả về 'không xác định' ...

$('select').change(function(){
    alert($(this).data('id'));
});

<select>
    <option data-id="1">one</option>
    <option data-id="2">two</option>
    <option data-id="3">three</option>
</select>

Có tốt hơn không khi sử dụng $ (this) .find (': chọn') hoặc $ (this) .children ('tùy chọn: đã chọn')?
userBG

Câu trả lời:


640

Bạn cần tìm tùy chọn đã chọn:

$(this).find(':selected').data('id')

hoặc là

$(this).find(':selected').attr('data-id')

mặc dù phương pháp đầu tiên được ưa thích


tôi đã sử dụng nhầm attr () trong bài viết bẩm sinh của mình, tôi có nghĩa là dữ liệu () nhưng nó trả về 'không xác định' cho tôi.
userBG

6
Tôi vừa mới bắt gặp điều này và tôi tự hỏi liệu phương pháp đầu tiên được ưa thích vì lý do hiệu suất, hay lý do khác? @JordanBrown
Clarkey

1
@Clarkey tôi đoán là dữ liệu () nhanh hơn attr () vì attr () phải làm thêm để tìm ra loại thuộc tính nào. Chỉ là một phỏng đoán tho.
dev_willis

37

Hãy thử như sau:

$('select').change(function(){
  alert($(this).children('option:selected').data('id'));
});

Thuê bao thay đổi của bạn đăng ký vào sự kiện thay đổi của lựa chọn, vì vậy thistham số là thành phần chọn. Bạn cần tìm đứa trẻ được chọn để lấy id dữ liệu từ đó.


Tính đến năm 2016 find()là nhanh hơn nhiều so với children()ngay cả trong những trường hợp như thế này khi chúng ta chỉ có độ sâu của cây là 2.
Hafenkranich

9
document.querySelector('select').onchange = function(){   
   alert(this.selectedOptions[0].getAttribute('data-attr')); 
};

Hãy luôn cố gắng hỗ trợ khối mã được đăng của bạn bằng lời giải thích và / hoặc tài liệu tham khảo (ngay cả khi giải pháp đơn giản / "tự giải thích") trên StackOverflow vì không phải ai cũng quen thuộc với cú pháp / hành vi / hiệu suất của ngôn ngữ đã cho.
mickmackusa

7

Vani Javascript:

this.querySelector(':checked').getAttribute('data-id')

Hãy luôn cố gắng hỗ trợ khối mã được đăng của bạn bằng lời giải thích và / hoặc tài liệu tham khảo (ngay cả khi giải pháp đơn giản / "tự giải thích") trên StackOverflow vì không phải ai cũng quen thuộc với cú pháp / hành vi / hiệu suất của ngôn ngữ đã cho.
mickmackusa

5

Bạn có thể sử dụng contextcú pháp với thishoặc $(this). Đây là hiệu ứng tương tự như find().

$('select').change(function() {
    console.log('Clicked option value => ' + $(this).val());
    <!-- undefined console.log('$(this) without explicit :select => ' + $(this).data('id')); -->
    <!-- error console.log('this without explicit :select => ' + this.data('id')); -->
    console.log(':select & $(this) =>    ' + $(':selected', $(this)).data('id'));
    console.log(':select & this =>       ' + $(':selected', this).data('id'));
    console.log('option:select & this => ' + $('option:selected', this).data('id'));
    console.log('$(this) & find =>       ' + $(this).find(':selected').data('id'));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
    <option data-id="1">one</option>
    <option data-id="2">two</option>
    <option data-id="3">three</option>
</select>

Là một vấn đề của vi mô hóa, bạn có thể chọn find(). Nếu bạn là người chơi mã nhiều hơn, cú pháp ngữ cảnh ngắn gọn hơn. Về cơ bản, nó đi xuống phong cách mã hóa.

Dưới đây là một so sánh hiệu suất có liên quan .


2
$('#foo option:selected').data('id');

1
Hãy luôn cố gắng hỗ trợ khối mã được đăng của bạn bằng lời giải thích và / hoặc tài liệu tham khảo (ngay cả khi giải pháp đơn giản / "tự giải thích") trên StackOverflow vì không phải ai cũng quen thuộc với cú pháp / hành vi / hiệu suất của ngôn ngữ đã cho.
mickmackusa

OP không có idthuộc tính trên thành phần chọn (và không cần thuộc tính vì tiện ích của this).
mickmackusa

1

cái này hiệu quả với tôi

<select class="form-control" id="foo">
    <option value="first" data-id="1">first</option>
    <option value="second" data-id="2">second</option>
</select>

và kịch bản

$('#foo').on("change",function(){
    var dataid = $("#foo option:selected").attr('data-id');
    alert(dataid)
});

1
Hãy luôn cố gắng hỗ trợ khối mã được đăng của bạn bằng lời giải thích và / hoặc tài liệu tham khảo (ngay cả khi giải pháp đơn giản / "tự giải thích") trên StackOverflow vì không phải ai cũng quen thuộc với cú pháp / hành vi / hiệu suất của ngôn ngữ đã cho.
mickmackusa
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.