自定义事件需设 cancelable: true 才能使用 preventDefault();触发前须检查 e.defaultPrevented;监听用 addEventListener,支持捕获与冒泡拦截;结合 bubbles 可实现父子协作控制。
配置自定义事件的默认行为,核心是复刻浏览器原生事件(如 click、submit)中 preventdefault() 的语义和流程——不是简单加个回调,而是让事件对象自带可取消的“行为契约”。这需要从事件创建、触发、监听到拦截四个环节统一设计。
创建事件时声明可取消性
使用 CustomEvent 构造函数时,必须显式设置 cancelable: true。这是调用 preventDefault() 前提,否则该方法无效:
const saveEvent = new CustomEvent('save', { cancelable: true, detail: { draft: true } });- 若省略
cancelable或设为false,后续调用e.preventDefault()不会生效,也不会报错,容易埋下隐患 - 注意:原生事件如
click默认就是cancelable: true,但自定义事件默认为false,这点必须主动覆盖
触发前检查是否被阻止
在真正执行默认动作(比如保存数据、跳转页面)之前,需判断事件是否已被取消:
- 监听方调用
e.preventDefault()后,e.defaultPrevented会变为true - 触发逻辑中应写成:
if (!e.defaultPrevented) { performActualSave(); } - 不要依赖返回值或异常,而是严格依据
defaultPrevented属性做分支——这与 DOM 规范完全一致
提供标准拦截接口
让使用者能像处理原生事件一样自然拦截,默认行为才真正“可配”:
- 监听时直接使用
addEventListener,不强制要求框架封装层 - 支持在任意层级调用
preventDefault(),包括委托监听或捕获阶段 - 若需兼容旧版 IE,可封装兼容函数:
function stopDefault(e) { e.preventDefault?.(); e.returnValue = false; }
结合冒泡机制扩展控制粒度
利用 bubbles: true,可实现“子组件提议默认行为 → 父容器统一拦截”的协作模式:
- 子组件触发
submit自定义事件,携带表单数据 - 父表单监听该事件,在捕获或冒泡阶段决定是否放行
- 例如权限校验失败时直接
e.preventDefault(),无需修改子组件逻辑 - 这种分层控制正是原生表单
submit事件的设计精髓
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











