meta name="format-detection" 在 ios safari 中已完全失效,自 ios 10 起被 webkit 彻底移除;唯一可靠方案是使用 -webkit-touch-callout: none 配合 role="text" 容器包裹数字。

meta 标签的 name="format-detection" 在 iOS Safari 中**已完全失效**,无法阻止电话号码识别。你加了 content="telephone=no" 也没用——这不是配置没写对,是 WebKit 早在 iOS 10 就移除了对该标签的支持,2026 年所有主流 iOS 版本(包括 iOS 16+)均无视它。
为什么 meta name="format-detection" 不再起作用
这个标签曾是 Safari 移动端的私有行为控制机制,但 Apple 从未将其纳入标准,也未承诺长期支持。自 iOS 10 起,该 meta 已被彻底弃用:不报错、不警告、不生效。开发者在 DevTools 里看到它“存在”,只是 HTML 解析器照常吞掉,底层渲染引擎根本不会读取。
-webkit-touch-callout: none 是唯一可靠的 CSS 控制点
真正能阻断 Safari 自动识别并生成拨号链接的,只有 WebKit 专属 CSS 属性:
-
-webkit-touch-callout: none—— 关键项,禁用长按弹出拨号菜单(也是识别触发后的第一道拦截) -
-webkit-text-security: none—— 辅助项,避免某些旧版 WebKit 把数字当密码字段处理而误触发 - 必须作用于**包裹数字的容器元素**(如
<span></span>、<div>),不能只写在 <code>或全局样式里 - 仅靠 CSS 不够稳定:若数字出现在
<a></a>、<button></button>等交互语义元素内,Safari 仍可能绕过样式强行识别 - 用
<span role="text"></span>包裹纯展示型数字(如订单号113987654321),role="text"显式声明该节点无交互意图 - 避免数字中混入短横线、括号、加号等易触发识别的符号(如
021-8765-4321);改用全角空格或普通空格分隔:021 8765 4321 - 身份证号、验证码、运单号等敏感数字,**绝不要直接放在
<p></p>或裸文本中**;必须套一层带上述 CSS +role的容器 - Safari 的电话识别发生在**渲染合成阶段**,早于 JS 事件循环
- 用户手指触达屏幕时,系统已决定“这是个电话”,随后直接唤起拨号 UI —— 页面 JS 根本收不到任何事件
- 即使绑了
pointer-events: none,也无法阻止底层识别逻辑,只让元素不可点,但长按仍会弹出拨号菜单
HTML 语义化配合才能 100% 避免误识别
CSS 只是压制表现层,源头上要告诉浏览器“这真不是电话”:
JavaScript 拦截点击完全无效
有人试过给数字加 onclick="event.preventDefault(); return false;" 或监听 touchstart,但失败原因很明确:











