เมื่อเลือกการเปลี่ยนแปลงรับค่า data data


273

รหัสต่อไปนี้จะส่งกลับ 'ไม่ได้กำหนด' ...

$('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>

ควรใช้ $ (นี้) .find (': select') หรือ $ (this) .children ('ตัวเลือก: เลือก') หรือไม่
userBG

2
ดูคำถามนี้: stackoverflow.com/questions/648004/…
Jordan Brown

คำตอบ:


640

คุณต้องค้นหาตัวเลือกที่เลือก:

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

หรือ

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

แม้ว่าวิธีแรกจะเป็นที่ต้องการ


ฉันใช้ผิดพลาด attr () ในโพสต์ inital ของฉันฉันหมายถึงข้อมูล () แต่มันกลับ 'ไม่ได้กำหนด' สำหรับฉัน
userBG

6
ฉันเพิ่งเจอสิ่งนี้และฉันสงสัยว่าวิธีแรกเป็นที่ต้องการเนื่องจากเหตุผลด้านประสิทธิภาพหรือเหตุผลอื่นหรือไม่ @JordanBrown
Clarkey

1
@ คลาร์กฉันเดาว่าจะเป็นข้อมูล () เร็วกว่า attr () เพราะ attr () ต้องทำงานพิเศษเพื่อคิดว่ามันเป็นคุณสมบัติประเภทใด เพียงเดาสรรพสิ่ง
dev_willis

37

ลองทำสิ่งต่อไปนี้:

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

ผู้สมัครสมาชิกการเปลี่ยนแปลงของคุณสมัครรับข้อมูลเหตุการณ์การเปลี่ยนแปลงของตัวเลือกดังนั้นthisพารามิเตอร์จึงเป็นองค์ประกอบที่เลือก คุณต้องค้นหาเด็กที่เลือกเพื่อรับ data-id


ในปี 2559 find()นั้นเร็วกว่าchildren()ในกรณีเช่นนี้ที่เรามีความลึกของต้นไม้เพียง 2 แห่ง
Hafenkranich

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

โปรดพยายามสนับสนุนบล็อกโค้ดที่โพสต์ของคุณด้วยคำอธิบายและ / หรือการอ้างอิง (แม้ว่าโซลูชันจะง่าย / "อธิบายตนเอง") ใน StackOverflow เนื่องจากไม่ใช่ทุกคนที่คุ้นเคยกับไวยากรณ์ / พฤติกรรม / ประสิทธิภาพของภาษาที่กำหนด
mickmackusa

7

Vanilla Javascript:

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

โปรดพยายามสนับสนุนบล็อกโค้ดที่โพสต์ของคุณด้วยคำอธิบายและ / หรือการอ้างอิง (แม้ว่าโซลูชันจะง่าย / "อธิบายตนเอง") ใน StackOverflow เนื่องจากไม่ใช่ทุกคนที่คุ้นเคยกับไวยากรณ์ / พฤติกรรม / ประสิทธิภาพของภาษาที่กำหนด
mickmackusa

5

คุณสามารถใช้contextไวยากรณ์ด้วยหรือthis นี่คือผลเช่นเดียวกับ$(this)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>

เป็นเรื่องของ microoptimization find()คุณอาจเลือกใช้ หากคุณเป็นนักกอล์ฟมากขึ้นไวยากรณ์บริบทจะสั้นกว่า มันเป็นรูปแบบการเข้ารหัสโดยทั่วไป

นี่คือการเปรียบเทียบผลการดำเนินงานที่เกี่ยวข้อง


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

1
โปรดพยายามสนับสนุนบล็อกโค้ดที่โพสต์ของคุณด้วยคำอธิบายและ / หรือการอ้างอิง (แม้ว่าโซลูชันจะง่าย / "อธิบายตนเอง") ใน StackOverflow เนื่องจากไม่ใช่ทุกคนที่คุ้นเคยกับไวยากรณ์ / พฤติกรรม / ประสิทธิภาพของภาษาที่กำหนด
mickmackusa

OP ไม่มีidแอตทริบิวต์ในองค์ประกอบที่เลือก (และไม่ต้องการเพราะองค์ประกอบของthis)
mickmackusa

1

มันใช้งานได้สำหรับฉัน

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

และสคริปต์

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

1
โปรดพยายามสนับสนุนบล็อกโค้ดที่โพสต์ของคุณด้วยคำอธิบายและ / หรือการอ้างอิง (แม้ว่าโซลูชันจะง่าย / "อธิบายตนเอง") ใน StackOverflow เนื่องจากไม่ใช่ทุกคนที่คุ้นเคยกับไวยากรณ์ / พฤติกรรม / ประสิทธิภาพของภาษาที่กำหนด
mickmackusa
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.