ZetCode

JavaScript target 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何在 JavaScript 事件中使用 target 属性来识别触发事件的元素。

target 属性

target 属性是对派发事件的对象的引用。它在传递给事件处理程序的 event 对象上可用。此属性是只读的,并提供对触发事件的元素的访问。

与引用处理程序绑定到的元素的 this 不同,target 始终引用发生事件的元素。这在事件委托场景中特别有用,因为事件会冒泡。

target 属性是 DOM Event 接口的一部分,并受所有现代浏览器支持。它适用于所有类型的 DOM 事件,包括点击、鼠标、键盘和表单事件。

基本点击事件目标

以下示例演示了在点击事件处理程序中 target 属性的基本用法。

index.html
<button id="myButton">Click me</button>
<script>
document.getElementById('myButton').addEventListener('click', function(event) {
    console.log('Target element:', event.target);
    console.log('Button text:', event.target.textContent);
});
</script>

当点击按钮时,事件处理程序会记录目标元素及其文本内容。event.target 引用了被点击的实际按钮元素。这展示了如何访问触发事件的元素的属性。

Target element: <button id="myButton">Click me</button>
Button text: Click me

Target vs currentTarget

此示例演示了 targetcurrentTarget 属性的区别。

index.html
<div id="container">
    <button id="innerButton">Click me</button>
</div>
<script>
document.getElementById('container').addEventListener('click', function(event) {
    console.log('Target:', event.target.id);
    console.log('CurrentTarget:', event.currentTarget.id);
});
</script>

当点击按钮时,target 是按钮,而 currentTarget 是 div。目标是触发事件的元素,而 currentTarget 是处理程序附加到的元素。这展示了事件冒泡的实际应用。

Target: innerButton
CurrentTarget: container

使用 target 的事件委托

target 属性对于高效的事件委托至关重要。

index.html
<ul id="itemList">
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
</ul>
<script>
document.getElementById('itemList').addEventListener('click', function(event) {
    if (event.target.tagName === 'LI') {
        console.log('Clicked item:', event.target.textContent);
    }
});
</script>

我们没有将处理程序附加到每个 li,而是使用一个 ul 上的处理程序。target 属性识别了被点击的 li。这种模式更有效,并且适用于动态添加的元素。

Clicked item: Item 2

获取目标属性

target 属性可用于访问元素属性。

index.html
<button data-id="123" data-action="delete">Delete Item</button>
<script>
document.querySelector('button').addEventListener('click', function(event) {
    const button = event.target;
    console.log('ID:', button.dataset.id);
    console.log('Action:', button.dataset.action);
});
</script>

此示例展示了如何从目标元素访问数据属性。dataset 属性提供对所有 data-* 属性的访问。这对于存储元素上的元数据以进行事件处理很有用。

ID: 123
Action: delete

表单输入目标

target 属性常用于表单元素。

index.html
<form id="myForm">
    <input type="text" name="username" placeholder="Username">
    <button type="submit">Submit</button>
</form>
<script>
document.getElementById('myForm').addEventListener('submit', function(event) {
    event.preventDefault();
    const username = event.target.elements.username.value;
    console.log('Username:', username);
});
</script>

在这里,我们通过 target 属性访问表单输入值。elements 集合提供了对所有表单控件的访问。这展示了如何阻止默认的表单提交并手动处理数据。

Username: JohnDoe

更改目标样式

target 属性可用于修改触发元素。

index.html
<style>
.highlight { background-color: yellow; }
</style>
<div class="boxes">
    <div class="box">Box 1</div>
    <div class="box">Box 2</div>
    <div class="box">Box 3</div>
</div>
<script>
document.querySelector('.boxes').addEventListener('click', function(event) {
    if (event.target.classList.contains('box')) {
        event.target.classList.toggle('highlight');
    }
});
</script>

点击任何盒子都会切换其高亮类。target 属性允许我们修改被点击的特定元素。这演示了对事件源元素的直接操作。

实际用例:动态内容

这是一个使用 target 与动态添加内容的实际示例。

index.html
<div id="taskList">
    <button id="addTask">Add Task</button>
</div>
<script>
const taskList = document.getElementById('taskList');
const addButton = document.getElementById('addTask');

let taskCount = 0;

addButton.addEventListener('click', function() {
    taskCount++;
    const task = document.createElement('div');
    task.className = 'task';
    task.textContent = `Task ${taskCount}`;
    taskList.appendChild(task);
});

taskList.addEventListener('click', function(event) {
    if (event.target.className === 'task') {
        console.log('Completed:', event.target.textContent);
        event.target.style.textDecoration = 'line-through';
    }
});
</script>

此代码动态添加任务并通过事件委托处理对它们的点击。target 属性识别了被点击的任务,即使它们在附加处理程序时不存在。这种模式适用于任何动态添加的元素。

Completed: Task 3

来源

Event.target - MDN 参考

在本文中,我们演示了如何使用 target 属性来有效地处理 JavaScript 中的事件。

作者

我的名字是 Jan Bodnar,我是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。