解决jQuery Ajax图片上传成功后无法自动刷新页面的问题
解决jQuery Ajax上传后页面不刷新的问题
你的问题核心在于jQuery的success回调没有触发,而原生XMLHttpRequest的load事件不受返回内容格式影响,所以能正常执行刷新。结合你的代码,问题出在这几个地方:
问题分析
dataType: 'json'的限制:jQuery的success回调仅在请求成功且返回内容能被解析为合法JSON时才会触发。如果你的后端a_slike_up.php没有返回标准JSON(比如返回了普通文本、HTML,或者JSON格式错误),success就不会执行,自然不会触发刷新。而原生load事件只要请求完成(不管返回内容)就会触发,所以原生代码能正常工作。setInterval使用错误:你用了setInterval,它会每隔7秒重复刷新页面,这通常不是需求,应该用setTimeout只执行一次刷新。
解决方案
方案1:移除不必要的dataType(推荐,若不需要JSON返回)
如果后端不需要返回JSON数据,直接去掉dataType: 'json',并替换setInterval为setTimeout:
inpfi.on('change', function(){ var flist = inpfi[0].files; var fd = new FormData(); for(let i = 0; i < flist.length; i++){ fd.append('flist[]', flist[i]); } $.ajax({ url: 'a_slike_up.php', type: 'post', data: fd, contentType: false, processData: false, success: function(){ // 延迟7秒刷新页面,不需要延迟可直接写location.reload() setTimeout(function(){ location.reload(); }, 7000); }, // 可选:添加error回调排查请求问题 error: function(xhr, status, err){ console.log('请求错误:', status, err); console.log('后端返回内容:', xhr.responseText); } }) });
方案2:确保后端返回合法JSON(若需要JSON交互)
如果必须用dataType: 'json',修改后端a_slike_up.php,确保上传完成后返回标准JSON:
// 处理完图片上传逻辑后 header('Content-Type: application/json'); echo json_encode(['status' => 'success']); exit;
然后保留dataType: 'json',同时修正定时器:
inpfi.on('change', function(){ var flist = inpfi[0].files; var fd = new FormData(); for(let i = 0; i < flist.length; i++){ fd.append('flist[]', flist[i]); } $.ajax({ url: 'a_slike_up.php', type: 'post', data: fd, dataType: 'json', contentType: false, processData: false, success: function(res){ console.log('上传成功:', res); setTimeout(function(){ location.reload(); }, 7000); }, error: function(xhr, status, err){ console.log('请求或解析JSON错误:', status, err); } }) });
方案3:使用complete回调(不管请求成功失败都刷新)
如果需求是只要上传请求完成就刷新页面,不管结果,改用complete回调(它在请求完成后总会触发):
inpfi.on('change', function(){ var flist = inpfi[0].files; var fd = new FormData(); for(let i = 0; i < flist.length; i++){ fd.append('flist[]', flist[i]); } $.ajax({ url: 'a_slike_up.php', type: 'post', data: fd, contentType: false, processData: false, complete: function(){ setTimeout(function(){ location.reload(); }, 7000); } }) });
内容的提问来源于stack exchange,提问作者provance
相关产品推荐
相关产品推荐

