0

我正在尝试修改jsPsych库中的脚本以进行语言和心理学实验,这是一个代码,它显示了行中的图像并且用户可以回答。

您可以设置图像可见多长时间的时间,但只能在组中(=每张图像的时间相同),但我需要显示最后一张和最后一张图像之前的不同时间。任何人都可以帮助我如何实现这一目标?

  var animate_interval = setInterval(function() {
    display_element.html(""); // clear everything
    animate_frame++;

    //zobrazeny vsechny obrazky
    if (animate_frame == trial.stims.length) { 
      animate_frame = 0;
      reps++;
      // check if reps complete //
      if (trial.sequence_reps != -1 && reps >= trial.sequence_reps) {
        // done with animation
        showAnimation = false;
      }
    }

    // ... parts of plugin, showing answers and so on.

  }, 
  3000); // <---------------- how to change this value for the last and one before lastelement?

我不知道这是否足以帮助我,但如果没有,请问我,我会尽力做到最好。提前非常感谢!

4

2 回答 2

1

代替 setInterval,您可以链接 setTimeout 回调。这将允许您操纵每个函数调用之间的延迟。以下是我将如何构建您的函数,然后实现逻辑以确定最后两个测试的延迟。

var showImage = function(currTest, lastTest) {
    display_element.html(""); // clear everything
    animate_frame++;

    //zobrazeny vsechny obrazky
    if (animate_frame == trial.stims.length) { 
        animate_frame = 0;
        reps++;
        // check if reps complete //
        if (trial.sequence_reps != -1 && reps >= trial.sequence_reps) {
            // done with animation
            showAnimation = false;
        }
    }
    // ... parts of plugin, showing answers and so on.

    // create a wrapper function so we can pass params to showImage
    var wrapper = function() {
        showImage(currTest + 1, lastTest);
    }

    if (currTest === lastTest) {
        setTimeout(wrapper, your_other_desired_delay);
    } else if (currTest - 1 === lastTest) {
        setTimeout(wrapper, your_desired_delay);
    } else if (currTest < lastTest) {
        setTimeout(wrapper, standard_delay);
    }
}

showImage(0, trials.length);
于 2015-11-05T23:09:52.087 回答
1

可以使用 setInterval 来显示使用不同时间间隔的图像。考虑以下:

控制系统使用相同的时间间隔显示图像 1,2,…n-2,并使用另一个时间间隔显示图像 n-1,n (“se​​tInterval”, 2015)。图 1 是根据 Petri 网的控制系统的过程模型。对于此回复的 PDF 版本,它是一个交互式 Petri 网。

在此处输入图像描述 图1

P_1 (m_1) 的标记等价于变量 animate_frame。如果 m_1=0 则不显示图像。如果 m_1=1 则显示第一张图像。如果 m_1=2 则显示第二张图像。等等。如果一共显示十张图片,则初始值为〖m〗_0=8,〖m〗_1=0,〖m〗_2=2.m_0用于控制第一个时间间隔的使用. m_2 用于控制第二个时间间隔的使用。m_1 用于显示图像。

有两种执行或运行逻辑:

  1. 第一个执行或运行逻辑(rn1)使用第一个时间间隔(例如一秒)。它显示图像 1 到 n-1。在显示图像 n-1 后,它删除了区间对象,并为第二个执行逻辑安排了一个新的区间对象。

  2. 第二个执行或运行逻辑(rn2)使用第二个时间间隔(例如四秒)。它显示最后一个图像,然后从显示中删除最后一个图像。

共有三种显示图像的方法。第一种方法 (T_0) 结合显示下一张图像,将 m_1 增加 1 并将 m_(0 ) 减少 1。第二种方法 (T_1) 结合显示下一张图像,将 m_1 增加 1 并将 m_2 减少 1 . 第三种方法(T_2)显示一个空格,去掉最后一张图片。在任何给定时刻,都不会出现计算逻辑 T_0、T_1 和 T_2 中的一个或仅出现其中一个。当所有计算逻辑都不能发生时,执行逻辑结束;换句话说,间隔对象被清除(例如clearInterval())。

使用图 1 中的 Petri 网作为指导,控制系统的计算机程序可以组织如下:

rn1

if (m_0≥1)  {
  // T_0
  m_0=m_0-1
  m_1=m_1+1
  // update image using plugin API
} else if ((m_0==0)  && (m_2≥1))  {
  // T_1
  m_2=m_2-1
  m_1=m_1+1
  // update image using plugin API
  clearInterval(ai);
  ai=setInterval(rn2,4000);
} else
  clearInterval(ai);

rn2

if (m_2≥1)  {
  // T_1
  m_2=m_2-1
  m_1=m_1+1
  // update image using plugin API
} else if (m_2==10)  {
  // T_2
  m_1=m_1-1
  // hide image using plugin API
} else
  clearInterval(ai);

启动控制系统:

ai=startInterval(rn1,1000);

然后 rn1 最终会调用 st2,而 rn2 最终会结束进程。如果需要额外的计算(例如 display_element.html("")),请将它们添加到 rn1 和 rn2。

参考

“setInterval,最后一个元素和最后一个元素之前的一个不同的间隔(jsPsych)”(2015)。堆栈溢出。于 2015 年 11 月 5 日从setInterval 中检索,最后一个元素和最后一个元素 (jsPsych) 的间隔不同

于 2015-11-08T02:11:52.987 回答