js中的preventDefault与stopPropagation详解


在JavaScript中,`preventDefault()` 和 `stopPropagation()` 是两个常用于事件处理中的方法,它们对事件的行为有着重要影响。

### preventDefault()

`preventDefault()` 方法用于阻止事件的默认行为。当事件发生时(如点击链接、提交表单等),浏览器通常会执行一个默认行为。使用 `preventDefault()` 可以取消这个默认行为。

**示例**:


document.getElementById('myLink').addEventListener('click', function(event) {
  event.preventDefault(); // 阻止链接的默认跳转行为
  console.log('链接被点击,但不会跳转。');
});

在这个例子中,点击ID为`myLink`的链接时,不会跳转到链接指向的地址,而是在控制台输出一条消息。

### stopPropagation()

`stopPropagation()` 方法用于阻止事件进一步传播(冒泡)或捕获。在DOM中,事件传播包括两个阶段:捕获阶段和冒泡阶段。默认情况下,事件会从DOM树的最顶层开始向下传播到目标元素(捕获阶段),然后从目标元素向上冒泡回顶层(冒泡阶段)。使用 `stopPropagation()` 可以阻止事件继续传播。

**示例**:


// 假设有一个嵌套的div元素
<div id="parent">
  <div id="child">点击我</div>
</div>

document.getElementById('parent').addEventListener('click', function(event) {
  console.log('父元素被点击');
});

document.getElementById('child').addEventListener('click', function(event) {
  event.stopPropagation(); // 阻止事件冒泡到父元素
  console.log('子元素被点击,且事件不会冒泡到父元素');
});

在这个例子中,点击子元素时,控制台会输出“子元素被点击,且事件不会冒泡到父元素”,而不会输出“父元素被点击”,因为我们在子元素的事件处理函数中调用了 `stopPropagation()`。

总结来说,`preventDefault()` 用于阻止事件的默认行为,而 `stopPropagation()` 用于阻止事件进一步传播。这两个方法在处理复杂事件逻辑时非常有用。