注意:本文中代码依赖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的差异
| 特性 | touchstart | click |
|---|---|---|
| 触发速度 | 立即触发(无延迟) | 通常有300ms延迟 |
| 适用场景 | 需要快速响应的交互 | 传统点击行为 |
| 多点触控 | 支持(可通过e.touches获取) | 不支持 |
2. 避免touchstart与click冲突
根据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 最新事件处理规范。

