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

如何基于函数返回的布尔值禁用及重新启用所有绑定的click事件

解决方案

方案1:前置事件拦截(推荐,侵入性低)

利用绑定在同一元素上的同类型事件按绑定顺序执行的特性,在所有原有点击事件绑定前先加一层拦截逻辑,不符合条件时直接终止后续事件执行,原有代码无需任何修改:

// 【注意】这段代码必须放在所有你的原有 $(document).on('click', 选择器, 回调) 绑定逻辑之前执行
// 引号内是所有需要拦截的元素选择器,多个用英文逗号分隔
$(document).on('click', '.a, .b, .c, .d', function(e) {
  if (!test()) {
    // 停止后续绑定在document上的同类型click事件执行
    e.stopImmediatePropagation();
    // 若需要同时阻止默认点击行为,可额外加一行 e.preventDefault()
  }
});

// 以下是你原本的业务代码,完全不需要修改
let tre = false;// 可根据业务条件动态切换为true或false
function test(){
  return tre;
}
$(document).on('click', '.a', function(){
  alert($(this).text());
});
$(document).on('click', '.b', function(){
  alert($(this).text());
});
// 剩余原有100多个点击事件绑定保持原样即可

方案2:包装jQuery on方法(适合选择器多的场景)

如果需要拦截的选择器数量太多,不好逐个罗列,可以统一重写jQuery的on方法,对所有绑定到document的click委托事件做统一校验,原有绑定代码同样无需修改:

// 先保存jQuery原始的on方法
const originalOn = $.fn.on;
$.fn.on = function (events, selector, data, fn) {
  // 仅对绑定在document上的click委托事件做包装,其他绑定逻辑不影响
  if (this[0] === document && events === 'click' && typeof selector === 'string' && typeof fn === 'function') {
    // 包装原有回调,增加校验逻辑
    const wrappedCallback = function (e) {
      if (test()) {
        return fn.apply(this, arguments);
      }
    };
    return originalOn.call(this, events, selector, data, wrappedCallback);
  }
  // 非目标场景直接走原始逻辑
  return originalOn.apply(this, arguments);
};

// 以下是你原本的业务代码,完全不需要修改
let tre = false;// 可根据业务条件动态切换为true或false
function test(){
  return tre;
}
$(document).on('click', '.a', function(){
  alert($(this).text());
});
$(document).on('click', '.b', function(){
  alert($(this).text());
});
// 剩余原有100多个点击事件绑定保持原样即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:27:04