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

如何删除jQuery.Deferred的progress回调及已绑定处理器?

如何移除jQuery.Deferred的progress回调函数?

首先明确:jQuery.Deferred的回调机制和DOM事件系统完全独立,你尝试的$(deferred).off('progress', callback)方法无效——该方法仅能移除通过jQuery事件系统绑定的处理器,而Deferred的progress回调由其内部Callbacks对象管理,和DOM事件无关。

jQuery没有提供公开API直接移除单个Deferred回调,但可通过以下两种方式解决需求:

方式一:清空所有progress回调

如果不需要保留其他progress回调,直接调用deferred.progress(null)即可清空所有已绑定的progress回调:

var deferred = $.Deferred();

var callback = function(n) {
    console.log('Test ' +n);
}

deferred.progress(callback);
deferred.notify(1); // 输出 Test 1

// 清空所有progress回调
deferred.progress(null);

deferred.notify(2); // 无输出

方式二:手动封装回调管理(移除特定回调)

若需精准移除某个特定回调,建议用jQuery的Callbacks对象封装一层,手动管理回调的添加与移除:

var deferred = $.Deferred();
var callback = function(n) {
    console.log('Test ' +n);
};

// 用Callbacks对象单独管理progress回调
var progressCallbacks = $.Callbacks();
// 将Deferred的progress事件转发到自定义Callbacks
deferred.progress(function() {
    progressCallbacks.fire.apply(progressCallbacks, arguments);
});

// 添加目标回调
progressCallbacks.add(callback);
deferred.notify(1); // 输出 Test 1

// 移除特定回调
progressCallbacks.remove(callback);
deferred.notify(2); // 无输出

这种方式基于jQuery公开API实现,不依赖Deferred内部私有属性(如_progressCallbacks),兼容性与稳定性更有保障。

内容的提问来源于stack exchange,提问作者Надим Закиров

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:27:22