如何删除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,提问作者Надим Закиров
相关产品推荐
相关产品推荐

