自定义变量
自定义变量用于声明这道 HTML 题要收集哪些数据。当 iframe 通过 postMessage 回传数据时,只有 key 命中已定义的变量名,才会被记录为这道题的作答结果;未定义的字段会被忽略。
使用场景
- iframe 里的小游戏结束后,回传得分、关卡等结果。
- 外部页面完成一次计算/选择后,回传最终选项。
- 需要把外部交互产生的任意结构化数据带回问卷进行统计与查看。
如何添加
在问卷编辑页右侧边栏的「自定义变量」区域:
- 在输入框输入变量名,点击「保存」(或回车)即新增一个变量,下方会出现对应的标签。
- 点击标签上的「x」可删除该变量。
(配图待补充)
变量名需与 iframe 回传数据里的 key 完全一致(区分大小写),否则不会被收集。
保留关键词
__WJ_IFRAME_QUESTION_END__ 是一个保留关键词,无需手动添加。iframe 发送它表示「本题作答完毕」,问卷收到后会关闭弹层并保存答案;同时它也会作为一条数据写入所在批次。详见 iframe 通信。
答案数据结构
问卷会把收集到的数据存为一段 JSON 字符串,内容是一个二维数组:每一次 postMessage(一批)对应一个子数组,子数组里每一项对应本次消息里的一个变量。同一轮作答内全量存储、不做覆盖,因此可以完整还原本轮的每次回传。
例如 iframe 依次发送:
window.parent.postMessage({ score: 90 }, '*');
window.parent.postMessage({ score: 90, level: 'A' }, '*');
最终存储为:
[
[{ "key": "score", "time": 1737345600000, "value": 90 }],
[
{ "key": "score", "time": 1737345600100, "value": 90 },
{ "key": "level", "time": 1737345600100, "value": "A" }
]
]
| 字段 | 说明 |
|---|---|
key | 命中的自定义变量名(含保留关键词 __WJ_IFRAME_QUESTION_END__) |
time | 问卷接收该批数据时的时间戳(同一批内一致) |
value | iframe 回传的对应值 |
同一个子数组内的
time理论上一致(同一次消息接收时间)。保留关键词__WJ_IFRAME_QUESTION_END__也会作为一条数据写入;仅未在自定义变量里定义的其它 key 会被忽略。
一次「打开 iframe → 发送结束关键词」为一轮作答。受访者再次点击触发元素会开启新一轮,作答完毕后新一轮的数据整体覆盖上一轮,不会与旧数据叠加,详见 iframe · 重复作答。
在哪里查看
作答数据可在「数据详情」中查看:HTML 题会显示「查看数据」按钮,点击后弹窗以表格展示——每行对应一次 postMessage,列为各自定义变量,末列为「触发时间」。
在自定义逻辑中使用
在自定义逻辑中用 VAR 函数读取变量值,第一个参数是该 HTML 题的题号,第二个参数是变量名:
if VAR(Q2, "水果") == "香蕉" then show Q3
if VAR(Q2, "水果") == "香蕉" and VAR(Q2, "饮料") == "可乐" then show Q3
replace "{{变量}}" in Q2 title with VAR(Q1, "水果")
有几点需要注意:
- 变量名必须已经在该题的「自定义变量」中声明,题号也必须是 HTML 题或 jsPsych 题,否则保存自定义逻辑时会提示错误。
- 由于变量是全量存储、不做覆盖的,同一个变量可能有多次回传值,只要其中任意一次的值满足比较条件,条件即成立。
- 变量值可以是文本也可以是数字:
==按文本比较,除字符串字面量外也能与其它题目的文本答案比较;>、<等大小比较要求两侧都是有效数字。 - 变量值在 iframe 发送保留关键词
__WJ_IFRAME_QUESTION_END__之后才会写入答案,因此依赖VAR的逻辑会在本题作答完毕后生效。
判定标准与题目一致:收到 __WJ_IFRAME_QUESTION_END__ 才算已答,因此不含 iframe 的纯展示 HTML 题不会命中。答案是一整包回传数据,只能这样做已答判断,参与 ==、> 等比较不会命中。
更多见语法-函数。