ในกรณีของตัวจัดการเหตุการณ์ที่ได้รับมอบหมายซึ่งคุณอาจมีสิ่งนี้:
<ul>
<li data-id="1">
<span>Item 1</span>
</li>
<li data-id="2">
<span>Item 2</span>
</li>
<li data-id="3">
<span>Item 3</span>
</li>
<li data-id="4">
<span>Item 4</span>
</li>
<li data-id="5">
<span>Item 5</span>
</li>
</ul>
และรหัส JS ของคุณเป็นเช่นนั้น:
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target),
itemId = $target.data('id');
//do something with itemId
});
});
คุณจะพบว่า itemId เป็นundefined
มากกว่าเพราะเนื้อหาของ LI นั้นถูกห่อหุ้มด้วย<span>
ซึ่งหมายความว่า<span>
อาจจะเป็นเป้าหมายของเหตุการณ์ คุณสามารถแก้ไขปัญหานี้ได้ด้วยการตรวจสอบขนาดเล็กเช่น:
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target).is('li') ? $(event.target) : $(event.target).closest('li'),
itemId = $target.data('id');
//do something with itemId
});
});
หรือหากคุณต้องการเพิ่มความสามารถในการอ่านสูงสุด (และหลีกเลี่ยงการเรียกซ้ำซ้อน jQuery ซ้ำซ้อนโดยไม่จำเป็น):
$(document).ready(function() {
$('ul').on('click li', function(event) {
var $target = $(event.target),
itemId;
$target = $target.is('li') ? $target : $target.closest('li');
itemId = $target.data('id');
//do something with itemId
});
});
เมื่อใช้การมอบหมายเหตุการณ์.is()
วิธีการนั้นมีค่ายิ่งสำหรับการตรวจสอบว่าเป้าหมายกิจกรรมของคุณ (เหนือสิ่งอื่นใด) เป็นสิ่งที่คุณต้องการ ใช้.closest(selector)
เพื่อค้นหาแผนผัง DOM และใช้.find(selector)
(โดยทั่วไปเชื่อมโยงกับ.first()
ใน.find(selector).first()
) เพื่อค้นหา คุณไม่จำเป็นต้องใช้.first()
เมื่อใช้.closest()
เนื่องจากจะส่งคืนองค์ประกอบบรรพบุรุษที่ตรงกันแรกเท่านั้นในขณะที่.find()
ส่งคืนการสืบทอดที่ตรงกันทั้งหมด