DOM事件:stopPropagation vs preventDefault() vs. return false

104 阅读1分钟

在事件中`event.stopPropagation()`、`event.preventDefault()`和`return false`之间该用哪一个?

当谈到在JavaScript中处理DOM事件时,我觉得我总是被一件事弄糊涂了。

我什么时候应该在事件对象上调用stopPropagation() ?什么时候应该在事件对象上调用preventDefault() ?应该return false

Event.stopPropagation

假设我想处理一个元素的点击事件。

默认情况下,DOM元素上的事件是在被点击的特定元素上触发的(例如,一个按钮),并且会传播到它的所有父元素树上,除非它被停止。

我想确保该事件在我的事件处理程序中被处理,并且它将在那里 "停止"。

你可以通过调用Event 对象的stopPropagation() 方法来停止传播,通常是在事件处理程序的最后。

const link = document.getElementById('my-link')
link.addEventListener('mousedown', event => {
  // process the event
  // ...

  event.stopPropagation()
})

Event.preventDefault

调用事件对象的preventDefault() 方法将取消浏览器被设定为执行的默认处理。

例如,在一个a 元素click 事件上打开一个新页面。

或者在submit 事件上提交一个form

调用preventDefault() 是你需要做的,以完全定制动作。也许通过创建一个fetch 请求来加载一些JSON,而不是在点击链接时打开一个新页面。

在这个相同元素上定义的其他事件处理程序将执行。除非你调用event.stopImmediatePropagation()

返回false

这对以前(或现在)的jQuery开发人员来说尤其令人困惑。在jQuery中,从一个事件处理程序返回false ,会自动为我们调用Event.preventDefaultEvent.stopPropagation

在vanilla JavaScript中,return false 在一个事件处理程序中没有任何作用。