主页/前端笔记/JS笔记/js绑定多个事件,事件节流、事件命名空间、性能优化建议

js绑定多个事件,事件节流、事件命名空间、性能优化建议

注意:本文中代码依赖jQuery。

使用.on()绑定多个事件的具体方法

方法1:绑定同一处理函数(适合逻辑相同场景)

// 语法:事件名称用空格分隔
$("元素").on("事件1 事件2 事件3", function(e) {
  // 共用逻辑
});

// 示例:点击或触摸时切换背景色
$("button").on("click touchstart", function() {
  $(this).toggleClass("active");
});

方法2:绑定不同处理函数(适合逻辑分离场景)

// 语法:使用对象格式 {事件1:函数, 事件2:函数}
$("元素").on({
  click: function(e) {
    console.log("鼠标点击");
  },
  touchstart: function(e) {
    console.log("触摸开始");
  },
  mouseenter: function(e) {
    console.log("鼠标悬停");
  }
});

方法3:动态元素的事件委托(2025年最新实践)

// 语法:父元素.on(事件, 子元素选择器, 函数)
$("#container").on("click touchstart", ".dynamic-item", function(e) {
  console.log("动态元素被触发");
});

移动端开发注意事项

1.touchstartvsclick的差异

特性touchstartclick
触发速度立即触发(无延迟)通常有300ms延迟
适用场景需要快速响应的交互传统点击行为
多点触控支持(可通过e.touches获取)不支持

2. 避免touchstartclick冲突

根据2023年博客园技术文章建议:

let isTouch = false;

$("button").on({
  touchstart: function() {
    isTouch = true;
    // 执行触摸逻辑
  },
  click: function() {
    if (!isTouch) {
      // 执行点击逻辑
    }
    isTouch = false; // 重置状态
  }
});

完整示例(结合伪元素点击场景)

$(document).ready(function() {
  // 同时绑定点击和触摸事件
  $("h4.toggle-title").on("click touchstart", function(e) {
    // 统一处理触摸/鼠标事件坐标
    const touch = e.originalEvent.touches ? e.originalEvent.touches[0] : e;
    const h4 = $(this);
    const offset = h4.offset();
    
    // 计算点击位置
    const clickX = touch.pageX - offset.left;
    if (clickX <= 16) { // 伪元素区域判断
      h4.next("ul").slideToggle(300);
      
      // 阻止默认行为(如滚动)
      e.preventDefault();
    }
  });
});

性能优化建议

事件节流
高频事件(如touchmove)需使用requestAnimationFrame

let ticking = false;
$("div").on("touchmove", function(e) {
  if (!ticking) {
    window.requestAnimationFrame(function() {
      // 更新逻辑
      ticking = false;
    });
    ticking = true;
  }
});

事件命名空间
方便批量移除事件:

$("h4").on("click.myNamespace", ...); // 移除特定命名空间事件 $("h4").off(".myNamespace");

以上方案已通过 Chrome 120+ 和 Safari 15+ 测试,符合 W3C 最新事件处理规范。