在Qualtrics

时间:2016-04-29 23:26:59

标签: javascript timer qualtrics

对于我正在研究的研究项目,我正在尝试使用Qualtrics上的Javascript功能来实现计时器,该功能将跟踪时间并将其显示给多个页面上的主题。

我的代码的一般想法是跟踪多个页面上的定时倒计时。也就是说,我有一系列任务,每个任务都在一个单独的页面上,但在同一个块中,我想显示每次加载新页面时剩余的时间。

为此,首先我定义了几个嵌入数据字段“timeleftrounded”和“start time”,然后保留稍后要分配的值。

其次,我将以下代码放在我希望定时器启动的页面之前的最后一个问题上。我的目的是让这段代码在当前时间读取以定义嵌入数据“start_time”

    Qualtrics.SurveyEngine.addOnload(function()
{
Event.observe($('NextButton'), 'click', function (e) 
    {    
        Qualtrics.SurveyEngine.setEmbeddedData("start_time", Date.now());
     });
});

在下一页我的任务开始,因为我希望科目总共有40分钟,我只需要写“40分钟”,无需代码。但是在这个问题上,我有更多的代码,然后应该计算单击加载下一页的按钮时剩余的时间(以分钟为单位)。

    Qualtrics.SurveyEngine.addOnload(function()
{
    Event.observe($('NextButton'), 'click', function () 
{ 
        var timeleftrounded = (2400000- (Date.now() - Number("${e://Field/start_time}")))/60000;    
    Qualtrics.SurveyEngine.setEmbeddedData("timeleftrounded",timeleftrounded);  
        });
    });

下一页使用以下代码将此变量“timeleftrounded”舍入到第一个小数点并将其显示给主题,

$e{ round(e://Field/timeleftrounded , 1) }

这是我的困惑开始的地方:虽然这个代码在我使用“View Block ...”功能时正常工作,当我使用完整的调查预览模式,或启动调查(我制作副本)时,计时器不会不工作 - 除非我对一个问题给出错误的答案,它只会显示“0”。每个页面都有一个带有验证检查的问题,一旦我给出一个错误的答案至少一次,计时器再次工作,但如果我只给出正确的答案,计时器永远不会工作。

希望我错过了一些明显的东西,但我无法在网上找到解决方案,所以我认为这可能是其他人也会感兴趣的东西。

1 个答案:

答案 0 :(得分:1)

在Next Button上添加事件监听器通常不起作用,因为Qualtrics在Next Button上有自己的事件监听器。

我将建议一个更简单的方法。使用内置的嵌入变量Q_TotalDuration,它始终具有当前测量的总持续时间,以秒为单位。

在调查流程中,就在您的定时问题开始之前:

<div id="timeLeft" style="text-align:right"></div>

标题中的HTML:

Qualtrics.SurveyEngine.addOnload(function()
{
    var timeleftrounded = (2400 - (parseInt("${e://Field/Q_TotalDuration}") - parseInt("${e://Field/start_time}")))/60;
    timeleftrounded = timeleftrounded.toFixed(1);  
    $('timeLeft').update(timeleftrounded + " minutes left");
});

关于您的定时问题的JavaScript(每页只需要一个):

type TemplateExecutor interface{
    ExecuteTemplate(wr io.Writer, name string, data interface{}) error
}

type DebugTemplateExecutor struct  {
    Glob string
}

func (e DebugTemplateExecutor) ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
    t := template.Must(template.ParseGlob(e.Glob))
    return t.ExecuteTemplate(wr, name, data)
}

type ReleaseTemplateExecutor struct  {
    Template *template.Template
}

func (e ReleaseTemplateExecutor) ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
    return e.Template.ExecuteTemplate(wr, name, data)
}