面试题 Interview Question
实现一个简单的事件委托函数
delegate
。
Implement a simple event delegation functiondelegate
.
要求 Requirements
-
函数接收以下参数:
The function should accept the following parameters:parent
:要绑定事件的父级元素(DOM 元素)
parent
: the parent DOM element to which the event listener is attachedselector
:需要响应事件的子元素的选择器(字符串)
selector
: a CSS selector string to match target child elementstype
:事件类型(如"click"
)
type
: the type of the event, e.g.,"click"
handler
:当事件发生在符合选择器的子元素上时调用的函数
handler
: the callback function to invoke when an event is triggered on a matching child
-
事件处理函数应当只在目标元素或其祖先匹配选择器时触发。
The event handler should trigger only when the event target or its ancestors match the selector.
参考答案 Reference Solution
function delegate(parent, selector, type, handler) {
parent.addEventListener(type, function (event) {
const targetElement = event.target.closest(selector);
if (targetElement && parent.contains(targetElement)) {
handler.call(targetElement, event);
}
});
}
示例 Example
<ul id="menu">
<li>首页</li>
<li>关于</li>
<li>联系</li>
</ul>
const menu = document.getElementById('menu');
delegate(menu, 'li', 'click', function (event) {
console.log('你点击了:', this.textContent);
// You clicked: this.textContent
});
面试考察点 Interview Focus
- 事件委托的原理(事件冒泡)
Understanding of event delegation via event bubbling - DOM API 熟悉程度
Familiarity with the DOM API (closest
,contains
,addEventListener
) - 代码的性能与灵活性
Code performance and flexibility when handling dynamic DOM elements