事件委托,Event.target 对比 Event.currentTarget
Event delegation, Event.target vs Event.currentTarget
在MDN Event.target reference中有一个关于实现事件委托的例子:
事件委托示例
// Assuming there is a 'list' variable containing an instance of an
// HTML ul element.
function hide(e) {
// Unless list items are separated by a margin, e.target should be
// different than e.currentTarget
e.target.style.visibility = 'hidden';
}
list.addEventListener('click', hide, false);
// If some element (<li> element or a link within an <li> element for
// instance) is clicked, it will disappear.
// It only requires a single listener to do that
例子中有不清楚的部分
示例中我不明白的是这条评论:
// Unless list items are separated by a margin, e.target should be
// different than e.currentTarget
问题
<li>
元素的边距如何影响 Event.target
和 Event.currentTarget
?
请记住 event.target
与 event.currentTarget
的不同之处,如 MDN Event.currentTarget reference 中所述:
我认为关键在于,如果没有边距,则无法直接单击 ul
,因为 li
元素将完全填满其 space。
如果有是边距,那么至少可能点击ul
,其中event.target
和 event.currentTarget
的情况相同。
function hide(e) {
document.querySelector("pre").textContent += 'e.target = ' + e.target.nodeName + ", e.currentTarget = " + e.currentTarget.nodeName + "\n";
}
document.querySelector("#list").addEventListener('click', hide, false);
ul {
border: 2px solid orange;
}
li {
padding: 10px;
color: blue;
margin: 30px;
border: 1px dashed blue;
}
<pre></pre>
<ul id="list">
<li>click me
<li>click me
<li>click me
</ul>
在MDN Event.target reference中有一个关于实现事件委托的例子:
事件委托示例
// Assuming there is a 'list' variable containing an instance of an
// HTML ul element.
function hide(e) {
// Unless list items are separated by a margin, e.target should be
// different than e.currentTarget
e.target.style.visibility = 'hidden';
}
list.addEventListener('click', hide, false);
// If some element (<li> element or a link within an <li> element for
// instance) is clicked, it will disappear.
// It only requires a single listener to do that
例子中有不清楚的部分
示例中我不明白的是这条评论:
// Unless list items are separated by a margin, e.target should be
// different than e.currentTarget
问题
<li>
元素的边距如何影响 Event.target
和 Event.currentTarget
?
请记住 event.target
与 event.currentTarget
的不同之处,如 MDN Event.currentTarget reference 中所述:
我认为关键在于,如果没有边距,则无法直接单击 ul
,因为 li
元素将完全填满其 space。
如果有是边距,那么至少可能点击ul
,其中event.target
和 event.currentTarget
的情况相同。
function hide(e) {
document.querySelector("pre").textContent += 'e.target = ' + e.target.nodeName + ", e.currentTarget = " + e.currentTarget.nodeName + "\n";
}
document.querySelector("#list").addEventListener('click', hide, false);
ul {
border: 2px solid orange;
}
li {
padding: 10px;
color: blue;
margin: 30px;
border: 1px dashed blue;
}
<pre></pre>
<ul id="list">
<li>click me
<li>click me
<li>click me
</ul>