You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于嵌入数据实现Qualtrics问卷模块内题目单次随机化并全程保持顺序

解决Qualtrics多模块题目顺序固定随机化问题

我明白你现在的痛点:要让所有任务模块里的三道题都遵循同一个从嵌入数据获取的顺序,而且不能靠重复加随机器的笨办法。之前的JS代码因为只匹配单个任务的题目、DOM操作不够稳定,导致显示异常,咱们来一步步修复它。

先理清核心前提

首先确保你给每道题都设置了唯一的Export Tag,比如:

  • task1_support、task1_like、task1_help
  • task2_support、task2_like、task2_help
  • ...以此类推所有任务的题目

这个Export Tag是咱们精准定位题目的关键,比靠QID或者模糊匹配靠谱多了。

原代码的核心问题

  1. 你的tagMap只写了task_1_like这类单个任务的标签,没法匹配其他任务的题目,导致只有task1的题可能被处理,其他任务完全没反应。
  2. 用flex order调整位置容易和Qualtrics的原生布局逻辑冲突,有时候会把题目挤没或者只显示一道。
  3. 依赖QuestionOuter的ID/HTML模糊匹配,Qualtrics渲染时的ID可能有变动,稳定性差。

可靠的解决方案代码

把这段代码放在每个任务模块最前面的空白题的JavaScript里(或者放在问卷的全局JS里,更省心):

Qualtrics.SurveyEngine.addOnReady(function() {
    // 获取嵌入数据里的顺序,比如"like_help_support"
    const outcomeOrderStr = "${e://Field/outcome_order}";
    // 调试用,按F12看控制台输出,确认数据是否正确获取
    console.log("当前题目顺序:", outcomeOrderStr);

    // 校验嵌入数据是否有效,如果没获取到就终止
    if (!outcomeOrderStr || outcomeOrderStr.includes("Field")) {
        console.warn("嵌入数据outcome_order未正确加载!");
        return;
    }

    // 把字符串拆分成顺序数组,比如["like", "help", "support"]
    const orderArray = outcomeOrderStr.split("_");
    console.log("顺序数组:", orderArray);

    // 找到当前模块的容器(也就是包含vignette和三道题的Block)
    const currentBlock = this.getQuestionContainer().closest(".Block");
    console.log("当前模块容器:", currentBlock);

    // 遍历顺序数组,按顺序重新排列题目
    orderArray.forEach((key, index) => {
        // 用Export Tag精准定位当前模块里的对应题目,比如找taskX_like
        // 匹配规则:Export Tag包含"_" + key,比如_support、_like、_help
        const targetQ = currentBlock.find(`[data-export-tag*="_${key}"]`).closest(".QuestionOuter");
        
        if (targetQ.length > 0) {
            // 把题目移到当前模块的最后(按顺序依次添加)
            currentBlock.append(targetQ);
            console.log(`已将${key}类型题目移到当前模块第${index+1}位`);
        } else {
            console.warn(`当前模块未找到${key}类型题目,请检查Export Tag`);
        }
    });

    // 隐藏用来放代码的空白题
    this.hideQuestion();
});

代码关键说明

  1. 精准定位题目:用data-export-tag属性来匹配题目,这是Qualtrics官方提供的、稳定的选择器,只要你设置了正确的Export Tag(比如task1_support),就能精准找到_support对应的题。
  2. 按模块处理:每个任务模块的代码只处理当前模块内的题目,不会影响其他模块,完美适配你的多任务场景。
  3. DOM操作更稳定:用append()把题目按顺序移到模块末尾,比flex order更符合Qualtrics的渲染逻辑,不会出现显示异常。
  4. 调试友好:控制台输出能帮你快速排查问题,比如确认嵌入数据是否正确、题目是否找到。

额外注意事项

  • 确保在问卷Flow里,outcome_order的随机器放在所有任务模块之前,这样所有模块都能获取到同一个随机顺序。
  • 每个任务模块的结构要一致:都是一个vignette(可以是文本题)+ 三道滑块题,代码会自动处理当前模块内的三道题。
  • 如果用全局JS(问卷设置→Look and Feel→Advanced→Header),可以把代码改成遍历所有Block,这样不用每个模块都加空白题,更高效:
Qualtrics.SurveyEngine.addOnload(function() {
    const outcomeOrderStr = "${e://Field/outcome_order}";
    if (!outcomeOrderStr || outcomeOrderStr.includes("Field")) return;
    const orderArray = outcomeOrderStr.split("_");

    // 遍历所有模块
    document.querySelectorAll(".Block").forEach(block => {
        orderArray.forEach(key => {
            const targetQ = block.querySelector(`[data-export-tag*="_${key}"]`)?.closest(".QuestionOuter");
            if (targetQ) {
                block.appendChild(targetQ);
            }
        });
    });
});

这样所有模块都会自动按同一个顺序排列题目,不用重复加代码,适合你任务量大的场景。

内容的提问来源于stack exchange,提问作者flâneur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 06:38:45