
在混合支持触控(如 iOS)和非触控设备时,直接绑定 "click tap" 会导致现代 iOS 上事件被触发两次;应通过特性检测区分交互方式,仅绑定单一原生事件(touchend 或 click),从根本上避免重复执行。
在混合支持触控(如 ios)和非触控设备时,直接绑定 `"click tap"` 会导致现代 ios 上事件被触发 twice;应通过特性检测区分交互方式,仅绑定单一原生事件(`touchend` 或 `click`),从根本上避免重复执行。
为兼容旧版 iOS(如 iOS 9 及更早)又不破坏新版 iOS(iOS 13+)或桌面端体验,不应同时监听 click 和 tap —— 因为 jQuery 的 tap 事件本质是基于 touchstart/touchend 自定义的模拟事件,而现代 iOS 浏览器在启用 viewport 元标签(如 )后,会同时触发 touchend 和 click(约 300ms 延迟后),造成函数执行两次。
✅ 正确解法是:放弃 tap,改用可靠的原生事件 + 环境检测:
jQuery 1.12.4是jQuery 1.x系列的最后一个正式稳定版本,由jQuery团队于2016年发布。该版本主要面向需要兼容旧版浏览器环境的网站和Web应用,尤其适用于仍需支持Internet Explorer 6、Internet Explorer 7、Internet Explorer 8等老旧浏览器的项目。
function handleInteraction(e) {
e.preventDefault(); // 防止默认行为干扰(如链接跳转)
console.log("yey!");
}
// 特性检测:优先判断是否支持触摸
if ('ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.platform.indexOf('iPhone') !== -1 || navigator.platform.indexOf('iPad') !== -1) {
// 触控设备:绑定 touchend(比 touchstart 更接近“点击完成”语义,且避免误触)
$(".test").on("touchend", handleInteraction);
} else {
// 非触控设备:绑定 click
$(".test").on("click", handleInteraction);
}
⚠️ 注意事项:
- 不要使用 e.stopPropagation() 或 e.stopImmediatePropagation() 临时拦截——这无法解决根源问题,且可能影响事件委托;
- 避免依赖 jQuery Mobile 的 tap,因其已停止维护,且在现代浏览器中行为不可靠;
- 若需统一处理(如 React/Vue 项目中),推荐使用 FastClick 或现代方案 pointerdown(但需注意兼容性:IE10+/Edge, Chrome 55+, Firefox 59+);
- 必须确保页面包含响应式 viewport 标签:,否则 iOS 可能禁用 touchend 或强制延迟 click。
? 总结:事件重复的本质是平台演进带来的双事件流(touchend → click),而非 jQuery Bug。通过精准的设备能力检测 + 单一原生事件绑定,即可实现跨平台、零重复、高性能的交互响应。










