docs: spec按CF7 6.1.6源码实测修正——wpcf7statuschanged状态机/原生submit触发form_submit/时序确认

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-09-18 20:03:43 +08:00
parent a65cee162f
commit d820e4305e
@@ -27,14 +27,14 @@
### 1.2 form_*(Contact Form 7 全过程) ### 1.2 form_*(Contact Form 7 全过程)
监听 CF7 DOM 事件(冒泡至 document)。**事件名/载荷以实测与源码为准**(见 §6 验证路径),设计按 CF7 5.x/6.x 已知形态:`wpcf7submit / wpcf7invalid / wpcf7spam / wpcf7mailsent / wpcf7mailfailed`。 监听 CF7 DOM 事件(**已按线上 CF7 6.1.6 源码实测核验**,2026-09-18):CF7 6.x 无 wpcf7invalid/wpcf7mailsent 等旧事件——全过程状态走 **`wpcf7statuschanged`**(`detail.status` ∈ init/validating/invalid/unaccepted/spam/mail_sent/mail_failed/resetting);`wpcf7submit` 在 AJAX 响应后才触发(带 apiResponse,弃用);CF7 拦截原生 submit 于 form 元素冒泡阶段(`preventDefault` + `wpcf7.submit` 内构造 FormData),所有自定义事件 `bubbles:true`。FormData 构造含 hidden 字段(`:where(input,textarea,select):enabled` + default append)。
| 事件 | 触发 | 属性 | | 事件 | 触发 | 属性 |
|---|---|---| |---|---|---|
| form_start | .wpcf7-form 内首次 isTrusted focusin/input(每表单实例一次) | form_id | | form_start | .wpcf7-form 内首次 isTrusted focusin/input(每表单实例一次) | form_id |
| form_submit | wpcf7submit(**每次尝试**) | form_id, submission_id | | form_submit | **表单原生 submit(document capture,与 _ctk_sid 写入同点——先于 CF7 拦截)**,每次尝试 | form_id, submission_id |
| form_error | wpcf7invalid / wpcf7spam | form_id, submission_id, error_code(invalid/spam/other——other 为 forward-compat 桶,若 CF7 源码核验发现其他失败事件则启用), field_count | | form_error | wpcf7statuschanged(status=invalid/unaccepted → error_code "invalid";spam → "spam") | form_id, submission_id, error_code, field_count |
| form_submit_result | wpcf7mailsent → result_code:"mail_sent";wpcf7mailfailed → "mail_failed" | form_id, submission_id, result_code | | form_submit_result | wpcf7statuschanged(status=mail_sent → "mail_sent";mail_failed → "mail_failed") | form_id, submission_id, result_code |
- **submission_id 语义**:一次提交尝试 = 一个 ID——**原生 submit 捕获时生成并写入隐藏字段**(§1.5 时序设计),form_submit / result 事件引用该 ID。form_start 不生成。 - **submission_id 语义**:一次提交尝试 = 一个 ID——**原生 submit 捕获时生成并写入隐藏字段**(§1.5 时序设计),form_submit / result 事件引用该 ID。form_start 不生成。
- **form_id 规整**:从 CF7 unit_tag/action 解析表单编号 → `cf7-{ID}`(如 cf7-156),不暴露完整内部串。 - **form_id 规整**:从 CF7 unit_tag/action 解析表单编号 → `cf7-{ID}`(如 cf7-156),不暴露完整内部串。
@@ -101,7 +101,7 @@ spec 附录写死(阶段C 直接照做,客迹侧零改动):
## 6. 验证与部署 ## 6. 验证与部署
- **CF7 事实核验(实现第一步)**:读线上 CF7 版本(当前 6.1.6)公开源码(wp-content/plugins/contact-form-7/includes/js/index.js)确认事件 dispatch 名/payload/FormData 时序;Playwright 在 hesucar 空表单提交实测 invalid+submit 路径(无副作用)。开发期不真提交验证 mailsent——按源码实现,**部署后以本节末条的真实测试询盘闭环验证**。 - **CF7 事实核验(已完成,2026-09-18)**:线上 CF7 6.1.6 源码实测——事件集/时序/FormData 行为已写入 §1.2(wpcf7statuschanged 状态机 + 原生 submit capture 确定性时序 + hidden 字段采集确认)。开发期不真提交验证 mailsent——按源码实现,**部署后以本节末条的真实测试询盘闭环验证**。
- SDK 单测:点击委托命中/漏判、CF7 事件模拟、submission_id 每次尝试独立、form_start 去重、pattern 匹配、onSegmentChange、track 补归属。 - SDK 单测:点击委托命中/漏判、CF7 事件模拟、submission_id 每次尝试独立、form_start 去重、pattern 匹配、onSegmentChange、track 补归属。
- server 测试:6 新事件校验(枚举/格式)、漏斗 API distinct session 口径、归因 paid_social/utm_medium 分支、规则 v2 重算幂等。 - server 测试:6 新事件校验(枚举/格式)、漏斗 API distinct session 口径、归因 paid_social/utm_medium 分支、规则 v2 重算幂等。
- admin:时间线渲染新事件、漏斗卡数据正确。 - admin:时间线渲染新事件、漏斗卡数据正确。