调用preventDefault后触发click未执行a标签默认跳转行为怎么办
问题核心原因
- 事件解绑写法错误:AngularJS 封装的 jqLite/ jQuery 的
unbind(新版本对应off方法)不支持直接传入事件对象完成解绑,必须指定事件类型和对应的处理函数引用。你当前使用匿名函数作为点击处理逻辑,根本无法被正确解绑,导致手动调用$elem.click()时,同一个处理函数会被二次触发,再次执行event.preventDefault()阻止了跳转行为。 - 多余的事件中断调用:
event.stopImmediatePropagation()会直接中断同元素后续绑定的同类型事件执行,如果你需要其他绑定的点击处理函数正常执行,这个调用不符合你的预期。
修复后的实现方案
方案1:二次触发点击实现跳转
首先将匿名处理函数改为具名函数,确保可以正确解绑:
// 获取元素逻辑省略 const customClickHandler = (event) => { event.preventDefault(); // 确有需要阻止其他同类型事件执行时再保留下面这行 // event.stopImmediatePropagation(); // 你的异步校验逻辑 asyncCheckFunction().then(() => { // 异步校验通过、需要放行跳转的分支 $elem.off('click', customClickHandler); // 正确解绑当前自定义处理函数 $elem[0].click(); // 直接调用原生DOM的click方法,避免jqLite封装逻辑干扰,兼容性更好 }).catch(() => { // 校验不通过不需要跳转的分支,保留事件绑定即可,下次点击仍会触发校验 }) } $elem.on('click', customClickHandler);
方案2:直接操作地址跳转(更简洁稳定)
如果不需要二次触发其他绑定的点击事件,直接读取 href 属性跳转即可,不需要处理事件解绑,逻辑更简单:
$elem.bind('click', (event) => { event.preventDefault(); asyncCheckFunction().then(() => { window.location.href = $elem.attr('href'); }) })
内容的提问来源于stack exchange,提问作者CheeZe5
相关产品推荐
相关产品推荐

