如何通过JQuery ajaxSend事件覆盖成功函数

2023-11-24

我试图覆盖 ajaxsend 事件的成功函数,但它不起作用 这是代码:

    $(document).ajaxSend(function(event,xhr,options){
        console.log('ajaxSend');
        var tempSuccess = options.success;
        options.success = function(data, textStatus, jqXHR){
            console.log('start');
            tempSuccess(data, textStatus, jqXHR);
            console.log('end');
        }; xhr.success = options.success;});

在 AJAX 上,我确实在控制台中看到“ajax”,但成功后我看不到开始和结束调试消息。

我做错了什么?


你想要完成的事情无法完成ajaxSend。问题是ajaxSend显然可以使用原件的副本xhr and options对象,因此修改不会产生任何效果。您可以使用以下代码轻松测试:

$(document).ajaxSend(function(event, xhr, options){
    delete options.success;
    console.log(options.success);   // undefined
});
$.ajax({
    url: "test.html",
    success: function() { console.log("this will be printed nevertheless"); }
});


所以你不能使用ajaxSend覆盖成功回调。相反,您必须“破解”jQuery 的 AJAX 函数:

// closure to prevent global access to this stuff
(function(){
    // creates a new callback function that also executes the original callback
    var SuccessCallback = function(origCallback){
        return function(data, textStatus, jqXHR) {
            console.log("start");
            if (typeof origCallback === "function") {
                origCallback(data, textStatus, jqXHR);
            }
            console.log("end");
        };
    };

    // store the original AJAX function in a variable before overwriting it
    var jqAjax = $.ajax;
    $.ajax = function(settings){
        // override the callback function, then execute the original AJAX function
        settings.success = new SuccessCallback(settings.success);
        jqAjax(settings);
    };
})();

现在您可以简单地使用$.ajax照常:

$.ajax({
    url: "test.html",
    success: function() {
        console.log("will be printed between 'start' and 'end'");
    }
});

据我所知,任何 jQuery 的 AJAX 函数(例如$.get() or .load()) 内部使用$.ajax,所以这应该适用于通过 jQuery 完成的每个 AJAX 请求(不过我还没有测试过......)。



Something like that should also work with "pure" JavaScript by hacking the XMLHttpRequest.prototype. Note that the following won't work in IE, which uses ActiveXObject instead of XMLHttpRequest.
(function(){
    // overwrite the "send" method, but keep the original implementation in a variable
    var origSend = XMLHttpRequest.prototype.send;
    XMLHttpRequest.prototype.send = function(data){
        // check if onreadystatechange property is set (which is used for callbacks)
        if (typeof this.onreadystatechange === "function") {
            // overwrite callback function
            var origOnreadystatechange = this.onreadystatechange;
            this.onreadystatechange = function(){
                if (this.readyState === 4) {
                    console.log("start");
                }
                origOnreadystatechange();
                if (this.readyState === 4) {
                    console.log("end");
                }
            };
        }
        // execute the original "send" method
        origSend.call(this, data);
    };
})();

用法(就像通常的 XMLHttpRequest 一样):

var xhr = new XMLHttpRequest();
xhr.open("POST", "test.html", true);
xhr.onreadystatechange = function(){
    if (xhr.readyState === 4) {
        console.log("will be printed between 'start' and 'end'");
    }
};
xhr.send();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过JQuery ajaxSend事件覆盖成功函数 的相关文章

随机推荐

  • 如何启用 NestJs swagger 4.x 插件

    如何使用新的 swagger 插件 我的编译器选项中有它 compilerOptions plugins nestjs swagger plugin 我正在运行该应用程序nest start如上所述 https docs nestjs co
  • androidx_security_crypto_encrypted_prefs_key_keyset不存在

    我正在尝试使用更安全的方式编辑用户的共享首选项集EncryptedSharedPreferences private fun provideSecureSharedPreference context Context SharedPrefe
  • 如何更改内存地址中存储的值?

    可以说内存地址0A7F03E4存储一个值124 如何将其更改为300使用Python 是否有针对此类任务的模块 gt gt gt import ctypes gt gt gt memfield ctypes c char from addr
  • WooCommerce:在订单中保存对产品的更改时挂钩

    我已经找了好几个小时了 在编辑现有订单中的产品数量后 我无法弄清楚如何在单击 保存 时执行功能 我试过这个 add action woocommerce order edit product your function name funct
  • 使用 requireJs 的模块中的循环依赖关系

    阅读 requireJs 文档 为了修复循环依赖 建议使用exports为该模块创建一个空对象 该对象可立即供其他模块引用 我尝试了这段代码 但它似乎不起作用 怎么了 P S 阅读评论以查看输出 特别是 setTimeout 调用中的 B
  • 如何在我的网络服务器上检测移动客户端?

    当http请求到达我的服务器时 我如何检测它是否来自iphone android或其他设备 您可以获取用户代理 这表明它是什么浏览器类型 iphone chrome 即任何浏览器 来帮你 http whatsmyuseragent com
  • 使用ggplot2的stat_密度_2d仅显示高密度区域

    我想将 stat 密度2D 函数与分类变量一起使用 但将绘图限制在高密度区域 以减少重叠并提高易读性 我们以以下数据为例 plot data lt data frame X c rnorm 300 3 2 5 rnorm 150 7 2 Y
  • C++:使用向量/数组优化速度?

    我有一个嵌套的 for 循环结构 现在我在每次迭代开始时重新声明向量 void function n1 n2 bound etc for int i 0 i
  • 将 InputStream 读入 Data 对象

    在 Swift 3 x 中 我们通常使用以下方式处理二进制数据Data 从它你可以生成大多数其他重要的类型 并且它上面有有用的函数 但我如何创建一个Data从一个InputStream 有什么好的办法吗 我找不到好的方法 我们可以围绕不安全
  • 什么编程语言最像英语? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我主要是一名Python程
  • Bootstrap 4 与远程 Modal

    我无法使用新的 Twitter Bootstrap 版本 Bootstrap 4 alpha 让 Modal 在远程模式下工作 它与 Bootstrap 3 完美配合 使用 Bootstrap 4 我收到弹出窗口 但模型主体未加载 没有进行
  • 实施 Azure 共置缓存

    使用 VS2012 我从 WebRole Properties Caching Tab 添加了缓存功能 其中 它在 web config 中生成了以下 XML
  • 复合视图模型对象导致远程验证失败

    我在这个项目中的一些表单中使用了复合视图模型的模式 它运作得很好 在本例中 我有一个 VendorAddress 视图模型 我在这个项目的几个地方使用了 Address es 因此我制作了可以重复使用的 Address 视图模型对象 然后我
  • Airflow:为每个文件运行 DAG 的正确方法

    我有以下任务需要解决 文件通过端点不定期发送并存储在本地 我需要为每个文件触发 DAG 运行 对于每个文件 将执行相同的任务 总体流程如下 对于每个文件 运行任务 A gt B gt C gt D 正在批量处理文件 虽然这项任务对我来说似乎
  • 鼠标按下。兄弟姐妹 event.targets 上的传播

    我有 2 个具有 绝对位置 的兄弟节点 它们都处理 mousedown 事件 当我单击 div 2 的透明区域 如图所示 时 如何触发 div 1 的处理程序 如果重叠元素是动态的 我认为不可能使用常规事件冒泡来完成此操作 因为所讨论的两个
  • Azure Fluent API 创建 SQL Server 时出错 - 缺少 x-ms-request-id 标头

    我正在尝试使用 Azure Fluent API 创建一个新的 SQL Server https github com Azure azure sdk for net tree Fluent 但我总是得到 Microsoft Rest Az
  • 如何在代码中使用 wsDualHttpBinding 设置 WCF 客户端?

    我需要连接到我编写的 WCF 服务 而无需为我正在编写的客户端应用程序部署 app config 然而 我一直在努力弄清楚如何在代码中从客户端进行设置 据我所知 有人知道我需要做什么才能让它发挥作用吗 我真的很感激 这是我到目前为止得到的代
  • 如何在 Python 中找到正则表达式的所有匹配项?

    在我正在编写的程序中 我让 Python 使用re search 函数在文本块中查找匹配项并打印结果 但是 一旦在文本块中找到第一个匹配项 程序就会退出 在找到所有匹配项之前程序不会停止的情况下 如何重复执行此操作 有一个单独的函数可以做到
  • 根据目标类型的无形状贴图 HList

    我有以下问题 我想将 HList 的项目映射到另一个 HList 但如果 目标 类型是 URL 则源 HList 中的字符串只能转换为 URL val name Stackoverflow val url https stackoverfl
  • 如何通过JQuery ajaxSend事件覆盖成功函数

    我试图覆盖 ajaxsend 事件的成功函数 但它不起作用 这是代码 document ajaxSend function event xhr options console log ajaxSend var tempSuccess opt