You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

页面加载时Ajax正常执行,未完成时触发操作抛出空错误

问题解决思路

问题根源

当Ajax请求还在进行时跳转页面,原页面的DOM已经被销毁,但请求的success/error回调仍会触发,这时候回调里操作的loader或相关DOM元素已经不存在,就会抛出空引用错误。

解决方法

方法1:页面卸载时中止未完成的Ajax请求

先把Ajax请求实例保存下来,在页面即将卸载时调用abort()终止请求,这样后续回调就不会执行了。

// 保存Ajax请求实例
let ajaxRequest;

$(document).ready(function() {
    ajaxRequest = $.ajax({
        type: 'POST',
        url: url,
        async:true,
        data: sampledata,
        beforeSend: function () {
            loader.show();
        },
        success: function (data) {
            loader.remove();
            Display(data);
        },
        error: function (xml, status, error) {
           // 中止请求时会触发error,这里判断状态避免弹出不必要的提示
           if(status !== 'abort') {
               alert(error);
           }
        }
    });
});

// 页面卸载前中止未完成的请求
$(window).on('beforeunload', function() {
    if(ajaxRequest && ajaxRequest.readyState !== 4) {
        ajaxRequest.abort();
    }
});

方法2:回调里先检查元素是否存在

在success回调执行操作前,先确认要操作的DOM元素还存在,再执行后续代码:

$.ajax({
    type: 'POST',
    url: url,
    async:true,
    data: sampledata,
    beforeSend: function () {
        loader.show();
    },
    success: function (data) {
        // 先检查loader对应的DOM元素是否存在
        if($(loader.selector).length > 0) {
            loader.remove();
        }
        // 检查Display方法依赖的容器是否存在
        if($('#display-target').length > 0) {
            Display(data);
        }
    },
    error: function (xml, status, error) {
       alert(error );
    }
});

优先推荐第一种方法,直接终止不必要的请求,既能避免报错,也能节省服务器和浏览器资源。

内容的提问来源于stack exchange,提问作者luppy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:20:25