Skip to main content
Version: latest

自定义变量

自定义变量用于声明这道 HTML 题要收集哪些数据。当 iframe 通过 postMessage 回传数据时,只有 key 命中已定义的变量名,才会被记录为这道题的作答结果;未定义的字段会被忽略。

使用场景

  • iframe 里的小游戏结束后,回传得分、关卡等结果。
  • 外部页面完成一次计算/选择后,回传最终选项。
  • 需要把外部交互产生的任意结构化数据带回问卷进行统计与查看。

如何添加

在问卷编辑页右侧边栏的「自定义变量」区域:

  1. 在输入框输入变量名,点击「保存」(或回车)即新增一个变量,下方会出现对应的标签。
  2. 点击标签上的「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问卷接收该批数据时的时间戳(同一批内一致)
valueiframe 回传的对应值

同一个子数组内的 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 题不会命中。答案是一整包回传数据,只能这样做已答判断,参与 ==> 等比较不会命中。

更多见语法-函数