提交评分后Alert在Chrome正常显示,Firefox无响应求助
解决Firefox中Ajax成功回调alert不显示的问题
嘿,我一眼就揪出问题根源了——异步操作的时序冲突!你点击提交按钮后,刚调用setRating()发起Ajax请求,紧接着就执行location.reload()刷新页面。但Ajax是异步执行的,浏览器不会傻等请求完成才刷新,Firefox的异步调度逻辑让回调代码还没来得及执行,页面就已经刷新消失了,所以alert根本没机会弹出来;Chrome可能因为某些偶然的时序巧合让alert偶尔显示,但这本质上是个隐性bug。
下面是具体的修复步骤:
1. 调整页面刷新的时机
把location.reload()从点击事件里移到Ajax的success回调中,确保只有当评分提交成功后才刷新页面:
修改点击事件代码
原来的代码:
$('#btn_submit').click(function() { setRating($('.checked').length, transaksi_id, menu_id); location.reload(); });
改成:
$('#btn_submit').click(function() { setRating($('.checked').length, transaksi_id, menu_id); });
更新setRating函数
把刷新逻辑放到成功回调里,同时补充CSRF令牌(Laravel POST请求必须带这个,Firefox对这部分校验更严格):
function setRating(rating, pesanan_id, id_menu) { $.ajax({ url: '/pesananSaya/setRating/'+pesanan_id+'/'+rating, cache: false, type: 'post', dataType: 'json', // 带上Laravel的CSRF令牌,避免419错误 headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') }, success: function(data) { alert("Nilai rating dimasukkan."); // 只有请求成功后才刷新页面 location.reload(); }, // 新增错误回调,方便调试问题 error: function(xhr) { alert("Gagal mengirim rating: " + xhr.responseText); } }); }
2. 确保页面包含CSRF meta标签
在你的HTML头部添加CSRF令牌标签,这是Laravel处理POST请求的必要条件:
<meta name="csrf-token" content="{{ csrf_token() }}">
3. 优化Laravel控制器代码
你的控制器代码可以简化,避免多余的循环,同时返回更清晰的JSON响应:
public function setRatingPesananCust(Request $request, $id, $rating){ $userId = Auth::user()->id; // 直接更新对应用户、对应订单的评分记录,无需多次查询循环 Rating::where('id_transaksi', $id) ->where('id_user', $userId) ->update(['nilai_rating' => $rating]); // 返回标准JSON响应,前端更容易判断状态 return response()->json([ 'success' => true, 'message' => 'Rating berhasil diperbarui' ]); }
这样修改后,Firefox里的alert就能正常显示了——因为现在页面只会在Ajax请求成功完成、alert弹出后才会刷新。
内容的提问来源于stack exchange,提问作者Widarma Putra
相关产品推荐
相关产品推荐

