위임 된 이벤트 핸들러의 경우 다음과 같은 내용이있을 수 있습니다.
<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
});
});
undefined
LI의 내용이로 감싸 져 있기 때문에 itemId가 발견 될 가능성이 높습니다 <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()
모든 자손 반환 .