SweetAlert确认后btn.click()未触发的问题排查与解决
问题分析与解决方案
你的问题核心在于事件参数传递不规范,以及ASP.NET WebForms的LinkButton回发逻辑与模拟点击的兼容问题,导致确认后的btn.click()无法触发回发。以下是具体修正方案:
1. 修正JavaScript函数
修改函数逻辑,确保事件参数正确传递、返回值明确,并且直接调用ASP.NET的回发函数替代模拟点击:
function sweetAlertConfirm(event, btn, title, msg, icon) { // 兼容不同浏览器的事件对象获取 event = event || window.event; // 注意:dataset的属性值都是字符串类型,需用字符串判断 if (btn.dataset.confirmed === 'true') { btn.dataset.confirmed = 'false'; return true; // 允许触发回发 } else { event.preventDefault(); // 阻止默认回发 Swal.fire({ icon: icon, title: title, text: msg, showDenyButton: true, showCancelButton: true, confirmButtonText: 'Yes', denyButtonText: `No`, }).then((result) => { if (result.isConfirmed) { btn.dataset.confirmed = 'true'; // 直接调用ASP.NET的回发函数,比模拟点击更可靠 __doPostBack(btn.name, ''); } }); return false; // 明确阻止默认行为 } }
2. 修改LinkButton的客户端点击事件
在OnClientClick中传递当前事件对象event,确保函数能正确捕获并处理事件:
<asp:LinkButton runat="server" Style="margin-right: 10px;" ID="cmdDeleteGoal" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "GoalCode") %>' OnClientClick="return sweetAlertConfirm(event, this, 'Delete Goal?', 'Do you want to delete this goal?', 'question');" OnClick="cmdDeleteGoal_Click" > <i class="fa-solid fa-trash text-danger" data-bs-toggle="tooltip" data-bs-placement="top" title="Delete Goal"></i> </asp:LinkButton>
关键修改说明
- 传递事件参数:避免依赖全局
event对象,确保event.preventDefault()能稳定阻止初始回发。 - 直接调用
__doPostBack:ASP.NET LinkButton的回发逻辑本质是通过__doPostBack函数实现的,模拟点击可能因事件绑定优先级问题失效,直接调用该函数更可靠。 - 明确返回值:第一次调用(未确认)返回
false彻底阻止回发,确认后返回true允许回发,消除浏览器对undefined返回值的歧义处理。
内容的提问来源于stack exchange,提问作者mat mat
相关产品推荐
相关产品推荐

