
当点击删除链接触发确认弹窗后,若用户点击“取消”,页面仍会跳转并执行删除操作——根本原因是未阻止锚点默认跳转行为,需在 JavaScript 中调用 event.preventDefault() 阻止默认事件。
当点击删除链接触发确认弹窗后,若用户点击“取消”,页面仍会跳转并执行删除操作——根本原因是未阻止锚点默认跳转行为,需在 javascript 中调用 `event.preventdefault()` 阻止默认事件。
在原始代码中, 标签同时绑定了 onClick 事件和 href 属性:一旦用户点击,无论 confirm() 返回 true 还是 false,浏览器都会默认跳转到 href 指定的 URL(即 ./delete.php?userID=...),导致“取消”形同虚设。
关键问题在于:JavaScript 函数返回 false 并不能自动阻止 标签的默认跳转行为,除非该 return false 是内联事件处理器(如 onclick="return myFunction()")的直接返回值。而原代码中 onClick='myFunction()' 是无返回值调用,因此 return false 在函数内部无效。
✅ 正确解决方案是显式获取事件对象,并调用 event.preventDefault():
<a href="./delete.php?userID=<?php%20echo%20htmlspecialchars(%24row['userID']);%20?>" onclick="return myFunction(event)">Delete</a>
<script>
function myFunction(event) {
const confirmed = confirm("确定要删除此用户吗?");
if (!confirmed) {
event.preventDefault(); // 阻止跳转
return false;
}
// 点击“确定”时,允许默认跳转(即执行删除)
}
</script>
? 注意事项:
- 使用 onclick="return myFunction(event)" 而非 onClick='myFunction()',确保事件对象传入且函数返回值能控制默认行为;
- event.preventDefault() 必须在 !confirmed 分支中调用,否则跳转无法被拦截;
- 建议对 userID 进行 htmlspecialchars() 输出编码,防止 XSS(尤其在未使用 PDO/预处理语句时);
- 更安全的做法是改用 AJAX 删除(避免 GET 请求暴露敏感参数、防止重复提交),但当前场景下修复事件拦截已解决核心问题。
总结:取消按钮失效的本质是未干预 DOM 元素的默认行为。牢记——阻止跳转靠 preventDefault(),而非单纯 return false;合理传递事件对象并条件性调用,即可让确认逻辑真正生效。











