4

实际上,我花了很长时间从参差不齐的文档和大量的 Web 控制台检查中拼凑出这个问题的答案。由于迄今为止最有用的信息来自 Stack Overflow,因此我想将这个问题及其答案放在这里,以供其他任何搜索的人将来受益。

问题是,如何将 javascript 添加到会立即将该问题的答案保存到嵌入式数据字段中的问题?立即,如中,不等到下一个 Qualtrics.SurveyEngine.AddOnLoad()。这涉及一个子问题,即如何将 javascript 添加到调查问题并在单击“下一步”按钮时运行它?以及子问题,如何保存基于问题 ID 动态命名的嵌入数据字段?

告诫 Emptor:Qualtrics 并未明确支持所有这些 javascript 黑客行为,因此此处的代码最终可能会停止工作。

4

3 回答 3

10

以下是如何获取滑块的响应值并将其保存在嵌入式数据字段中,该字段的名称根据问题 ID 编号。这种方式只有在滑块的文本输入框可见时才有效。也可能有一种方法可以做到这一点,也许其他人可以将其添加到答案中。

Qualtrics.SurveyEngine.addOnload(function()
{
    // everything here runs when the page is loaded. So, we can get the Question ID here,
    // but we can't get the response value until later.
    var currentQuestionID = this.getQuestionInfo().QuestionID
    //var resultEmbeddedName = currentQuestionID + "_result"  //e.g. QID6_result 
    var resultEmbeddedName = "result_" + currentQuestionID.substring(3)   //e.g. result_6

    $('NextButton').onclick = function (event) {
        // everything in here will run when you click the next button
        // note that it has access to javascript variables from the enclosing function
        // however, if you declare something in here with "var" then it will be a LOCAL variable

        // the following alert will appear when you click the next button. For me, it appears twice;
        // I'm not sure why.

        // Save the current question's response value
        var responseTextField = document.getElementById(currentQuestionID + '~1~result')
        var currentResponse = responseTextField.value
        alert("Result: " + currentResponse + "\nwill be available to future questions as: \n$" + "{e://Field/" + resultEmbeddedName + "}")

        Qualtrics.SurveyEngine.setEmbeddedData(resultEmbeddedName, currentResponse)

        // and now run the event that the normal next button is supposed to do
        Qualtrics.SurveyEngine.navClick(event, 'NextButton')
    }

});

对于多项选择项目,它有点复杂。这是有效的代码,有很多评论和演示。请注意,变量“currentResponse”最终保存了所选选项的 NUMBER,而“currentChoiceText”最终保存了该选项的文本标签(例如是或否),因此您可以保存您喜欢的任何一个。

Qualtrics.SurveyEngine.addOnload(function()
{
    // everything here runs when the page is loaded. So, we can get the Question ID here,
    // but we can't get the response value until later.
    var currentQuestionID = this.getQuestionInfo().QuestionID
    console.log("Current Question ID is: " + currentQuestionID)
    //var resultEmbeddedName = currentQuestionID + "_result"  //e.g. QID6_result 
    var resultEmbeddedName = "result_" + currentQuestionID.substring(3)   //e.g. result_6

    $('NextButton').onclick = function (event) {
        // everything in here will run when you click the next button
        // note that it has access to javascript variables from the enclosing function
        // however, if you declare something in here with "var" then it will be a LOCAL variable

        // the following alerts will appear when you click the next button. For me, it appears twice;
        // I'm not sure why.

        // Save the current question's response value

        var questionObject = Qualtrics.SurveyEngine.getInstance(currentQuestionID)
        var currentResponse = questionObject.getSelectedChoices()[0] //in case more than one is selected, it will only work here to take one!   
        var theQuestionInfo=questionObject.getQuestionInfo()
        var choicesObject=theQuestionInfo.Choices
        var thisChoiceObject=choicesObject[currentResponse]
        var currentChoiceText=thisChoiceObject.Text

        console.log("Number of the current choice is " + currentResponse)
        console.log("Text of the current choice is " + currentChoiceText)


        alert("Result: " + currentChoiceText + "\nwill be available to future questions as: \n$" + "{e://Field/" + resultEmbeddedName + "}")

        Qualtrics.SurveyEngine.setEmbeddedData(resultEmbeddedName, currentChoiceText)

        // and now run the event that the normal next button is supposed to do
        Qualtrics.SurveyEngine.navClick(event, 'NextButton')
    }

});

这两个都动态引用问题 ID,因此如果您将问题复制到新问题,它们将单独工作。无需更改任何 javascript 代码。

要测试这些,请制作一个滑块问题或一个多项选择问题并添加相应的 javascript。然后,在分页符后制作另一张幻灯片(分页符是出现“下一步”按钮所必需的)。在该幻灯片中,放置一个管道文本字段,例如 ${e://Field/result_1} 或警报对话框告诉您保存的值将是什么。预览调查时,您应该会在第二个问题的管道文本字段中看到在第一个问题上输入的值。

就本演示而言,您当然可以仅使用管道文本实现相同的效果。但是,如果您出于某种原因希望问题实际上立即将其响应保存到嵌入式数据中,这将为您做到这一点。

此外,如果您需要知道在单击下一步按钮时如何运行代码,这可以适应任何一般需要。

于 2014-04-04T00:22:24.813 回答
0

我在 $('NextButton').onclick 方法中调用以下代码时遇到问题,这会强制 $('NextButton').onclick 方法被调用两次。删除它对我有用,因此 onclick 方法只被调用一次,但仍会向前推进调查。

// and now run the event that the normal next button is supposed to do
Qualtrics.SurveyEngine.navClick(event, 'NextButton')
于 2015-07-22T18:57:03.450 回答
0

每次按下“下一步”按钮时都会起作用。希望有帮助!

Qualtrics.SurveyEngine.addOnload(function(){
var nextButton =document.getElementById("NextButton");
if (nextButton!=null){
    $("NextButton").on("click", function(event) {

    alert("Hello World!");
    });
  } 
});
于 2016-04-05T05:15:53.040 回答