你不知道的preventDefault

  1. defaultPrevented可用于判断当前事件是否调用了event.preventDefault(), 该值在相同事件的多个响应函数内共享状态,即fn1调用了event.preventDefault(), fn2内获取到的defaultPrevented为true
dom.addEventListener("click", function fn1(event) {
    event.preventDefault()
}, false)
dom.addEventListener("click", function fn1(event) {
    console.log("event.defaultPrevented", event.defaultPrevented) // => true
}, false)
注意:因为addEventListener的响应函数根据绑定顺序执行,故fn1的代码总是比fn2先执行,所以即便fn2调用了event.preventDefault(),fn1获取defaultPrevented状态时fn2的代码还没运行,返回的也是false
  1. preventDefault的结算在下次macroTask之前(结算:判断是否需要运行默认动作,如打开超链接),即fn1的preventDefault调用生效了,可以阻止超链接的跳转,fn2的调用不会生效,因为setTimeout的回调函数运行时preventDefault已经结算
dom.addEventListener("click", function fn1(event) {
    queueMicrotask(() => {
        event.preventDefault()
    })
})
dom.addEventListener("click", function fn1(event) {
    setTimeout(() => {
        event.preventDefault()
    })
})

结合1和2可以自定义超链接的跳转逻辑:

linkDOM.addEventListener("click", function fn1(event) {
    queueMicrotask(() => {
        // 判断是否阻止了默认动作,没有就可以继续运行跳转逻辑
        if (!event.defaultPrevented){
            // 自定义跳转逻辑,如: window.open(linkDOM.href, "_top")
            event.preventDefault()
        }
        
    })
}, false)

你可能感兴趣的:(javascript,前端,dom)