Qualtrics区块多问题自定义验证:强制upvote/downvote各4次咨询
在Qualtrics中实现强制4次Upvote和4次Downvote的方案
核心思路
你提到的嵌入数据计数思路是可行的,但需要结合JavaScript实现实时计数更新、选项禁用控制和下一步按钮的状态切换。以下是可落地的分步操作:
步骤1:初始化嵌入数据字段
- 进入问卷的「流程」页面,在目标区块上方添加两个嵌入数据字段:
- 字段名:
upvoteCount,初始值设为0 - 字段名:
downvoteCount,初始值设为0
- 字段名:
- 确保这两个字段在目标区块之前加载,保证计数能被正确读取和更新。
步骤2:给区块内所有问题添加自定义JavaScript
将以下代码复制到区块内每个问题的「添加JavaScript」面板中(问题编辑页面→齿轮图标→添加JavaScript):
Qualtrics.SurveyEngine.addOnload(function() { var survey = Qualtrics.SurveyEngine; var currentQuestion = this; // 从嵌入数据读取当前计数,避免页面刷新后丢失状态 let upvoteCount = parseInt(survey.getEmbeddedData("upvoteCount")) || 0; let downvoteCount = parseInt(survey.getEmbeddedData("downvoteCount")) || 0; // 页面加载时先禁用已达上限的选项 disableOverLimitChoices(currentQuestion, upvoteCount, downvoteCount); // 监听选项点击事件 currentQuestion.getChoices().forEach(choice => { choice.onclick(() => { const selectedText = choice.getChoiceText().trim(); // 更新计数并同步到嵌入数据 if (selectedText === "upvote") { upvoteCount++; survey.setEmbeddedData("upvoteCount", upvoteCount); } else if (selectedText === "downvote") { downvoteCount++; survey.setEmbeddedData("downvoteCount", downvoteCount); } // 更新区块内所有问题的选项状态 updateAllBlockChoices(upvoteCount, downvoteCount); // 检查是否满足条件,切换下一步按钮状态 toggleNextButton(upvoteCount, downvoteCount); }); }); // 初始加载时检查是否已满足条件(比如回退页面的情况) toggleNextButton(upvoteCount, downvoteCount); }); // 禁用当前问题中已达上限的选项 function disableOverLimitChoices(question, upvoteCount, downvoteCount) { question.getChoices().forEach(choice => { const text = choice.getChoiceText().trim(); if (text === "upvote" && upvoteCount >= 4) { choice.disable(); } else if (text === "downvote" && downvoteCount >= 4) { choice.disable(); } }); } // 更新区块内所有问题的选项禁用状态 function updateAllBlockChoices(upvoteCount, downvoteCount) { const blockQuestions = Qualtrics.SurveyEngine.getCurrentBlock().getQuestions(); blockQuestions.forEach(question => { disableOverLimitChoices(question, upvoteCount, downvoteCount); }); } // 控制下一步按钮的启用/禁用 function toggleNextButton(upvoteCount, downvoteCount) { const nextBtn = document.getElementById("NextButton"); if (upvoteCount === 4 && downvoteCount === 4) { nextBtn.disabled = false; nextBtn.style.opacity = "1"; } else { nextBtn.disabled = true; nextBtn.style.opacity = "0.5"; } }
步骤3:关键细节说明
- 选项文本匹配:代码中判断的
"upvote"和"downvote"必须和你问卷中选项的文本完全一致(包括大小写、空格),否则计数逻辑会失效。 - 初始按钮状态:代码默认会在页面加载时禁用下一步按钮,直到计数达标才会启用,无需额外设置。
- 测试验证:发布测试链接后,模拟操作:
- 选满4次upvote后,后续问题的upvote选项会自动灰掉无法点击
- 选满4次downvote后同理
- 只有当upvote和downvote都达到4次时,下一步按钮才会变为可点击状态
- 页面刷新兼容:因为计数存在嵌入数据中,参与者刷新页面后,计数会从嵌入数据中读取并恢复选项禁用状态,不会丢失进度。
内容的提问来源于stack exchange,提问作者user72716
相关产品推荐
相关产品推荐

