ping属性是浏览器原生的轻量级点击追踪机制,仅在href合法、用户真实点击、目标支持text/ping时触发一次性POST请求,发送固定字符串“PING”,不支持参数,Safari不支持,Chrome限制第三方上下文。

它不是用来测网络延迟的,也不是通用埋点方案;它是浏览器原生支持的、仅在用户真实点击有效 链接时触发的一次性 POST 通知,且只发固定字符串 PING,不带业务参数,Safari 完全不认,Chrome 在 iframe 里默认禁用。
ping 属性真正触发的三个硬性条件
写上 ping 属性不等于就能发请求。它像一个“守规矩的信使”,只在完全合规时才出发:
-
href必须是合法可跳转 URL(不能是javascript:void(0)、#或空值) - 必须由用户真实鼠标点击或触屏 tap 触发(
link.click()脚本调用无效) - 目标服务器需明确允许接收
text/ping类型请求(响应头含Access-Control-Allow-Origin: *或对应源)
常见失效场景:Vue Router 里用 @click.prevent 拦住跳转再 router.push,此时 ping 完全静默;React 中用 useNavigate 替代原生跳转,同样绕过整个机制。
发出的请求到底长什么样
浏览器发送的是极简 POST,没有自定义空间:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- URL:就是
ping属性里写的地址(支持多个,空格分隔) - Method:
POST - Content-Type:
text/ping(注意不是text/pingback,后者是 WordPress pingback 协议) - Request Body:
PING(纯 ASCII 字符串,大小写敏感,不可改) - 关键请求头:
PING-FROM(当前页完整 URL)、Referer(受referrerpolicy影响)、Origin(跨域时存在) - Cookie:仅同源时自动携带,跨域不带
这意味着你没法塞 utm_source、用户 ID、事件上下文——它只适合统计“这个 banner 被点了几次”,不适合“谁在什么页面点了哪个商品”。
上线后 ping 请求没发出去?先查这四件事
部署后看不到请求,大概率不是代码写错了,而是环境或策略卡住了:
- Chrome 98+ 默认屏蔽第三方上下文中的
ping(比如你页面嵌在别人网站的里) - Safari 至今(2026 年 4 月)仍不支持
ping属性,且无启用计划 - 如果页面设置了
referrerpolicy="no-referrer",Referer头会消失,部分日志服务因解析失败直接丢弃整条记录 - 企业防火墙、CDN 或安全网关常主动拦截
Content-Type: text/ping请求,返回 403 或超时,前端毫无提示
它不是一个“写了就跑”的功能,而是一个需要前后端对齐、接受 Safari 零覆盖、且无法重试或反馈的窄口径能力。最容易被忽略的,其实是后端必须专门开一个能接收 text/ping 的 endpoint,并容忍无响应体、无状态、无重试的“单向喊话”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










