Qualtrics:使用Javascript为Loop/Merge块内的问题实现计分功能
问题根因
- 代码中
if判断使用了单等号=,这是赋值运算符而非比较运算符:- 执行
if(answer = 0)时会直接将answer赋值为0,0对应的布尔值为假,该分支永远不触发 - 后续执行
if(answer = 1)时会直接将answer赋值为1,1对应的布尔值为真,该分支永远触发,所以不管选什么mmm都会被设为1
- 执行
- 第二版代码直接取选项的
innerText,拿到的是字符串Yes/No,和数字0/1完全不匹配,即使修正等号也无法得到正确结果
解决方案
首先提前在**Survey Flow最顶部(进入Loop/Merge块之前)**声明answer和mmm两个Embedded Data字段,不需要设置默认值,只需提前创建即可,否则setEmbeddedData无法正常写入数值。
推荐写法(直接读取Recode值)
直接使用你第一版代码的取值逻辑,修正比较运算符即可:
Qualtrics.SurveyEngine.addOnPageSubmit(function() { // 读取选中选项的Recode值并转为数字,避免字符串类型导致的判断异常 const answer = parseInt(jQuery("#" + this.questionId + " .q-checked").val(), 10); Qualtrics.SurveyEngine.setEmbeddedData('answer', answer); // 用===做严格相等判断 if(answer === 0) { Qualtrics.SurveyEngine.setEmbeddedData('mmm', '0'); } else if(answer === 1) { Qualtrics.SurveyEngine.setEmbeddedData('mmm', '1'); } });
适配第二版代码(读取选项文本)
如果你需要基于选项文本判断,可以使用修正后的第二版代码:
Qualtrics.SurveyEngine.addOnPageSubmit(function() { // 去除文本前后空格避免匹配失败 const answerText = this.questionContainer.querySelector(".q-checked").nextElementSibling.innerText.trim(); Qualtrics.SurveyEngine.setEmbeddedData('answer', answerText); if(answerText === 'Yes') { Qualtrics.SurveyEngine.setEmbeddedData('mmm', '0'); } else if(answerText === 'No') { Qualtrics.SurveyEngine.setEmbeddedData('mmm', '1'); } });
完成修改后,原有显示逻辑无需调整,即可实现选Yes展示问题A、选No展示问题B的效果。
内容的提问来源于stack exchange,提问作者Mary A.
相关产品推荐
相关产品推荐

