Ajax提交注册表单仅首次展示成功提示后续提交不显示问题排查
问题根因
- 首次提交成功后执行
$('#ohsnap').fadeOut('fast')时,jQuery会自动为该元素添加display: none的内联样式。后续提交成功时你只移除了d-none类,没有清除这个内联样式,也没有主动将元素设置为可见,因此提示框实际处于隐藏状态,无法正常展示。 - 额外隐患:如果用户短时间内多次提交,多个定时器会叠加触发,可能导致新的提示还没到2秒就被之前的定时器提前隐藏。
修复代码
仅需要修改前端Ajax的done回调逻辑即可,修改后的完整代码如下:
<script> // 存储定时器ID,避免多次提交时定时器冲突 let noticeTimer = null; $("#btn").on('click', function () { var ajaxFraindName = $("#ajaxFraindName").val(); var ajaxControlItem = $("#ajaxControlItem").val(); var calender = $("#calender").val(); var SingelControlState = $("#SingelControlState").val(); if (ajaxFraindName == '' || ajaxControlItem == '' || calender == '' || SingelControlState == '') { alert("لطفا ورودی ها را پر کنید"); } else { $.ajax({ type: "Post", url: '@Url.Action("submitSingelControlItem", "Hasabrsee")', data: { 'ajaxControlItem': $("#ajaxControlItem").val(), 'ajaxFraindName': $("#ajaxFraindName").val(), 'Projectid': $("#Projectid").val(), 'ProjectName': $("#ProjectName").val(), 'ProjectManagementName': $("#ProjectManagementName").val(), 'calender': $("#calender").val(), 'SingelControlState': $("#SingelControlState").val(), } }).done(function (res) { if (res.status == 'ok') { // 先清除之前的定时器,避免旧定时器提前隐藏本次提示 clearTimeout(noticeTimer); // 先调用.show()清除fadeOut设置的display:none内联样式,再修改类和内容 $("#ohsnap").show().removeClass('d-none alert-danger').addClass('alert-success').html('مورد کنترلی با موفقیت ثبت شد'); $("#ajaxControlItem").val(""); $("#ajaxFraindName").val(""); } noticeTimer = setTimeout(function () { $('#ohsnap').fadeOut('fast', function() { // fadeOut结束后加回d-none类,重置元素初始状态 $(this).addClass('d-none'); }); }, 2000) }); } }); </script>
核心改动点说明
- 显示提示前新增
show()方法,清除fadeOut留下的display: none内联样式 - 新增定时器ID存储,每次显示新提示前清除上一次的定时器,避免定时器冲突
fadeOut回调中重新加回d-none类,重置元素初始状态,避免样式残留
内容的提问来源于stack exchange,提问作者stoo frisat
相关产品推荐
相关产品推荐

