Javascript新手求教:如何正确添加ontouch事件以兼容iPhone
嘿,作为JS新手遇到iOS上onclick无效的问题太正常了——Safari在触摸交互上确实有自己的小脾气。我来给你拆解几个实用的解决办法,从快速改造到规范写法都有:
解决iOS上onclick无响应的问题,正确添加触摸交互
方案1:直接加ontouchstart属性(最快见效)
最简单的方式就是在你的<a>标签上同时绑定ontouchstart事件,让iOS设备优先响应触摸动作,同时不影响桌面端的点击:
<a href="javascript:void(0);" style="font-size:12px; color: #f2f2f2;" class="icon" onclick="myFunction()" ontouchstart="myFunction()">☰</a>
不过要注意:这种写法可能会导致触摸和点击重复触发(比如快速触摸后),如果你的myFunction是切换类名这类操作,会出现来回切换的问题。可以给函数加个简单的防重复逻辑:
let isProcessing = false; function myFunction() { if (isProcessing) return; isProcessing = true; var x = document.getElementById("myTopnav"); if (x.className === "topnav") { x.className += " responsive"; } else { x.className = "topnav"; } // 100ms后解除标记,避免重复执行 setTimeout(() => { isProcessing = false; }, 100); }
方案2:用事件监听绑定(更规范的写法)
内联事件(onclick/ontouchstart)虽然简单,但不利于代码维护。推荐用addEventListener统一绑定事件,还能避免重复绑定的问题:
先修改HTML,去掉内联事件:
<a href="javascript:void(0);" style="font-size:12px; color: #f2f2f2;" class="icon" id="menuToggle">☰</a>
然后在JS里绑定点击和触摸事件:
const menuToggle = document.getElementById('menuToggle'); let isProcessing = false; function handleMenuToggle() { if (isProcessing) return; isProcessing = true; var x = document.getElementById("myTopnav"); if (x.className === "topnav") { x.className += " responsive"; } else { x.className = "topnav"; } setTimeout(() => { isProcessing = false; }, 100); } // 同时绑定点击和触摸事件 menuToggle.addEventListener('click', handleMenuToggle); menuToggle.addEventListener('touchstart', handleMenuToggle);
方案3:优化iOS的onclick响应(无需额外触摸事件)
如果你不想加触摸事件,也可以通过CSS告诉iOS这个元素是可点击的,这样它会正常响应onclick,还能去掉讨厌的300ms延迟(前提是你的页面已经加了viewport元标签):
首先确保HTML头部有这个元标签:
<meta name="viewport" content="width=device-width, initial-scale=1.0">
然后给.icon类添加CSS:
.icon { cursor: pointer; /* 可选:去掉iOS触摸时的高亮背景 */ -webkit-tap-highlight-color: transparent; }
这样你的原代码的onclick就能在iOS上正常工作了,改动最小~
额外小提示:换个更语义化的标签
用href="javascript:void(0)"有时候会有奇怪的行为,你可以换成<button>标签——它默认就是可点击元素,在iOS上不需要额外处理,语义化也更好:
<button style="font-size:12px; color: #f2f2f2; background: none; border: none; cursor: pointer;" class="icon" onclick="myFunction()">☰</button>
内容的提问来源于stack exchange,提问作者micks88
相关产品推荐
相关产品推荐

