qualtrics javascript:使用以前的答案自动填充矩阵表

时间:2016-01-26 21:40:15

标签: javascript html qualtrics

我在Qualtrics调查中两次询问相同的矩阵表(多个答案)问题。当我第二次向用户显示问题时,我希望从用户第一次回答问题时自动填充答案。我查看了文档中的代码片段,因此我知道如何选择当前问题中的复选框,例如。

for (var i = 1; i <= rows; i++) {
    for (var j = 1; j <= cols; j++) {
        this.setChoiceValue(i, j, true);
    }
}

我的问题是我无法弄清楚如何从上一个问题中获得所选答案。我尝试过类似的东西,但它不起作用(无法读取null的属性'attr'):

var isChecked = $("#QR~QID2~" + i + "~" + j").attr('checked');

This page from the documentation建议使用管道文字,类似于:

var selectedChoice = "${q://QID2/ChoiceGroup/SelectedChoices}";

这似乎为我提供了已选择的调查行中的唯一语句,但我需要为问题中的每个语句(行)获取所选答案(col)。我不确定如何制定正确的管道文本。

任何建议都将不胜感激!感谢。

编辑1:这是我最终使用的代码。

Qualtrics.SurveyEngine.addOnload(function()
{
    /*Place Your Javascript Below This Line*/
    var numChecks = $(this.getQuestionContainer()).select('input[type="checkbox"]');
    var numCols = 4;
    var numRows = numChecks.length / numCols;
    var map = {};

    //I won't have more than 20 rows in the matrix
    map[1] = "${q://QID53/SelectedAnswerRecode/1}";
    map[2] = "${q://QID53/SelectedAnswerRecode/2}";
    map[3] = "${q://QID53/SelectedAnswerRecode/3}";
    map[4] = "${q://QID53/SelectedAnswerRecode/4}";
    map[5] = "${q://QID53/SelectedAnswerRecode/5}";
    map[6] = "${q://QID53/SelectedAnswerRecode/6}";
    map[7] = "${q://QID53/SelectedAnswerRecode/7}";
    map[8] = "${q://QID53/SelectedAnswerRecode/8}";
    map[9] = "${q://QID53/SelectedAnswerRecode/9}";
    map[10] = "${q://QID53/SelectedAnswerRecode/10}";
    map[11] = "${q://QID53/SelectedAnswerRecode/11}";
    map[12] = "${q://QID53/SelectedAnswerRecode/12}";
    map[13] = "${q://QID53/SelectedAnswerRecode/13}";
    map[14] = "${q://QID53/SelectedAnswerRecode/14}";
    map[15] = "${q://QID53/SelectedAnswerRecode/15}";
    map[16] = "${q://QID53/SelectedAnswerRecode/16}";
    map[17] = "${q://QID53/SelectedAnswerRecode/17}";
    map[18] = "${q://QID53/SelectedAnswerRecode/18}";
    map[19] = "${q://QID53/SelectedAnswerRecode/19}";
    map[20] = "${q://QID53/SelectedAnswerRecode/20}";


    for (var i = 1; i <= numRows; i++) {
        //Get the recode values for row i
        var rowValues = map[i].split(",");
        //Loop through all the recode values for the current row
        for (var c = 0 ; c < rowValues.length; c++) {
            var val = parseInt(rowValues[c].trim());
            //Select the current question's checkboxes corresponding to the recode values
            this.setChoiceValue(i, val, true);
        }
    }
});

编辑2:

我现在有些奇怪的行为。我试图填充一个只有3行的表,所以我认为

    "${q://QID53/SelectedAnswerRecode/1}";
    "${q://QID53/SelectedAnswerRecode/2}";
    "${q://QID53/SelectedAnswerRecode/3}";

会给出前一个表中前三行的问题“QID53”的值。但实际上那些返回空字符串,并且直到调用

    "${q://QID53/SelectedAnswerRecode/5}";
    "${q://QID53/SelectedAnswerRecode/6}";
    "${q://QID53/SelectedAnswerRecode/7}";

我得到前三个值。

对于包含14行的表,在调用

之前不会返回任何内容
"${q://QID53/SelectedAnswerRecode/4}";

它将表格中的最后3行留空。

假设“SelectedAnswerRecode”之后的数字是行号,我错了吗?有什么关于我错过的偏移吗?

1 个答案:

答案 0 :(得分:1)

我认为您想要管道重新编码值。类似的东西:

var r1ar = parseInt("${q://QID2/SelectedAnswerRecode/1}");
var r2ar = parseInt("${q://QID2/SelectedAnswerRecode/2}");

然后设置值:

this.setChoiceValue(1, r1ar, true);
this.setChoiceValue(2, r2ar, true);

确保您的重新编码值与列ID匹配。

根据以下评论进行编辑/添加:

  1. 在将页面发送到浏览器之前,javascript中的管道值已解析服务器端,因此它们是固定值。没有办法让它们在javascript中动态化。如果您的问题由于显示逻辑或结转而具有可变数量的行,则您必须在javascript中包含所有可能的管道值,然后检查它们以查看哪些有效。

  2. 对于多个答案矩阵,您可以使用str.split(&#39;,&#39;)将逗号分隔列表转换为数组,然后遍历数组。 Qualtrics在逗号分隔列表中的逗号后面包含空格,因此您必须修剪()数组中的字符串。