มีคำตอบที่เป็นประโยชน์หลายประการ แต่ดูเหมือนจะไม่มีตัวเลือกใดครอบคลุมตัวเลือกล่าสุดทั้งหมด ด้วยเหตุนี้ตัวอย่างทั้งหมดของฉันยังรองรับการมีlabel
องค์ประกอบที่ตรงกันและช่วยให้คุณเพิ่มช่องทำเครื่องหมายแบบไดนามิกและดูผลลัพธ์ในแผงด้านข้าง (โดยการเปลี่ยนเส้นทางconsole.log
)
ฟังสำหรับclick
เหตุการณ์checkboxes
คือไม่ได้เป็นความคิดที่ดีที่สุดเท่าที่จะไม่อนุญาตให้มีการสลับแป้นพิมพ์หรือการเปลี่ยนแปลงที่ทำที่ตรงกับlabel
องค์ประกอบที่ถูกคลิก รับฟังchange
เหตุการณ์เสมอ
ใช้ jQuery หลอกตัวเลือกมากกว่า:checkbox
สั้นและอ่านง่ายขึ้นinput[type=checkbox]
:checkbox
ใช้is()
กับ jQuery :checked
pseudo-selector เพื่อทดสอบว่ามีการทำเครื่องหมายที่เช็คบ็อกซ์หรือไม่ สิ่งนี้รับประกันว่าจะทำงานได้กับทุกเบราว์เซอร์
ตัวจัดการเหตุการณ์พื้นฐานที่แนบกับองค์ประกอบที่มีอยู่:
$('#myform :checkbox').change(function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/2/
หมายเหตุ:
- ใช้
:checkbox
ตัวเลือกที่ต้องการใช้input[type=checkbox]
- เชื่อมต่อนี้เพียงองค์ประกอบที่ตรงกับที่มีอยู่ในเวลาที่เหตุการณ์นี้จะได้รับการจดทะเบียน
ตัวจัดการเหตุการณ์ที่ได้รับมอบหมายติดกับองค์ประกอบบรรพบุรุษ:
ตัวจัดการเหตุการณ์ที่ได้รับมอบหมายได้รับการออกแบบมาสำหรับสถานการณ์ที่องค์ประกอบอาจยังไม่มีอยู่ (โหลดหรือสร้างแบบไดนามิก) และมีประโยชน์มาก พวกเขามอบหมายความรับผิดชอบให้กับองค์ประกอบบรรพบุรุษ (จึงเป็นคำ)
$('#myform').on('change', ':checkbox', function () {
if ($(this).is(':checked')) {
console.log($(this).val() + ' is now checked');
} else {
console.log($(this).val() + ' is now unchecked');
}
});
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/4/
หมายเหตุ:
- วิธีนี้ใช้งานได้โดยฟังเหตุการณ์ (ในกรณีนี้
change
) เพื่อทำให้ฟองดูองค์ประกอบของบรรพบุรุษที่ไม่เปลี่ยนแปลง (ในกรณีนี้#myform
)
- มันแล้วใช้ตัวเลือก jQuery (
':checkbox'
ในกรณีนี้) กับองค์ประกอบเฉพาะในห่วงโซ่ฟอง
- มันแล้วใช้ฟังก์ชั่นการจัดการเหตุการณ์เฉพาะผู้ที่ตรงกันองค์ประกอบที่ทำให้เกิดเหตุการณ์
- ใช้
document
เป็นค่าเริ่มต้นเพื่อเชื่อมต่อตัวจัดการเหตุการณ์ที่ได้รับมอบหมายหากไม่มีสิ่งใดใกล้กว่า / สะดวกกว่า
- อย่าใช้
body
เพื่อแนบเหตุการณ์ที่ได้รับมอบหมายเนื่องจากมีข้อผิดพลาด (เกี่ยวข้องกับการใส่สไตล์) ที่สามารถหยุดการรับเหตุการณ์เมาส์ได้
ผลที่สุดของตัวจัดการที่ได้รับมอบหมายคือองค์ประกอบการจับคู่จะต้องมีอยู่ในเวลาเหตุการณ์เท่านั้นและไม่ใช่เมื่อมีการลงทะเบียนตัวจัดการเหตุการณ์ สิ่งนี้อนุญาตให้เพิ่มเนื้อหาแบบไดนามิกเพื่อสร้างเหตุการณ์
ถาม: ช้าลงไหม
ตอบ: ตราบใดที่เหตุการณ์มีความเร็วในการโต้ตอบกับผู้ใช้คุณไม่จำเป็นต้องกังวลเกี่ยวกับความแตกต่างเล็กน้อยในความเร็วระหว่างตัวจัดการเหตุการณ์ที่มอบหมายและตัวจัดการที่เชื่อมต่อโดยตรง ประโยชน์ของการมอบหมายงานนั้นมีมากกว่าข้อเสียเล็ก ๆ น้อย ๆ ตัวจัดการเหตุการณ์ที่ได้รับมอบหมายนั้นจริงแล้วเร็วกว่าในการลงทะเบียนเนื่องจากโดยทั่วไปแล้วพวกเขาจะเชื่อมต่อกับองค์ประกอบการจับคู่เดียว
ทำไมไม่ prop('checked', true)
เริ่มchange
เหตุการณ์
นี่คือการออกแบบ ถ้ามันเริ่มเหตุการณ์คุณจะเข้าสู่สถานการณ์ที่ไม่มีที่สิ้นสุดได้อย่างง่ายดาย แต่หลังจากเปลี่ยนคุณสมบัติที่ตรวจสอบแล้วให้ส่งกิจกรรมการเปลี่ยนแปลงไปยังองค์ประกอบเดียวกันโดยใช้trigger
(ไม่ใช่triggerHandler
):
เช่นtrigger
ไม่มีเหตุการณ์เกิดขึ้น
$cb.prop('checked', !$cb.prop('checked'));
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/5/
เช่นกับtrigger
เหตุการณ์การเปลี่ยนแปลงปกติถูกจับ
$cb.prop('checked', !$cb.prop('checked')).trigger('change');
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/6/
หมายเหตุ:
- อย่าใช้
triggerHandler
ตามที่แนะนำโดยผู้ใช้รายหนึ่งเนื่องจากจะไม่ทำให้เกิดเหตุการณ์ฟองให้กับตัวจัดการเหตุการณ์ที่มอบหมาย
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/8/
แม้ว่ามันจะทำงานสำหรับตัวจัดการเหตุการณ์เชื่อมต่อโดยตรงกับองค์ประกอบ:
JSFiddle: http://jsfiddle.net/TrueBlueAussie/u8bcggfL/9/
เหตุการณ์ที่ถูกเรียกด้วย. triggerHandler () จะไม่ทำให้เกิดลำดับชั้นของ DOM หากองค์ประกอบเป้าหมายไม่ได้รับการจัดการโดยตรงพวกเขาจะไม่ทำอะไรเลย
การอ้างอิง: http://api.jquery.com/triggerhandler/
ถ้าใครมีคุณสมบัติเพิ่มเติมพวกเขารู้สึกว่าจะไม่ได้รับการคุ้มครองโดยการนี้โปรดอย่าแนะนำเพิ่มเติม
this
ถูกตั้งค่าเป็นองค์ประกอบ DOM ของช่องทำเครื่องหมายแล้วจึงthis.checked
เพียงพอ คุณไม่จำเป็นต้องสร้างวัตถุ jQuery อีกชิ้นเว้นแต่คุณจะวางแผนจัดการมัน