将实验迁移到v7.x¶
7.0版本改变了jsPsych的很多核心功能。这些改变是为了让jsPsych更好地适配现代的JavaScript工具,如包管理器、打包工具,以及改善开发者的体验,以便更多人能为jsPsych贡献代码。我们希望这些改变能让项目生生不息,也能让更多开发者参与到jsPsych的开发中。
我们的目标是在实现这些改变的同时尽可能减少用户体验。不过,有一些地方我们不得不修改,对于那些熟悉v6.x版本的用户,可以参照这篇文档,看看v7.x中改变了什么。
加载jsPsych¶
引入jsPsych有3种方法。我们更新了hello world教程,其中对着三种方法进行了说明。如果你想使用和6.x版本最类似的方法,可以看看方法2。最大的不同之处在于,下载的库文件的文件结构有所不同,文件命名也发生了改变。
初始化和运行jsPsych¶
我们移除了jsPsych.init()
,并把其功能拆分成了两个函数。
在实验代码的开始,我们需要调用initJsPsych()
创建一个新的jsPsych实例,并将其保存到一个叫做jsPsych
的变量中。我们需要在这个函数中传入以前需要传入jsPsych.init()
的参数,除了timeline
参数以外。
var jsPsych = initJsPsych({
use_webaudio: false,
on_finish: function(){
jsPsych.data.displayData();
}
});
创建了时间线后,就可以通过jsPsych.run()
运行实验。该函数只有一个传入参数,就是这条时间线。这也是在6.x版本中使用jsPsych.init
的地方。由于jsPsych.run
函数只需要时间线,这个参数应该是一个 数组(而不是6.x版本中{timeline: timeline}
这样的对象)。
var timeline = [...]
jsPsych.run(timeline);
试次的type
参数¶
type
参数的值应该是插件类,而不是字符串。
例如,如果我们通过CDN引入html-keyboard-response
插件:
<script src="http://unpkg.com/@jspsych/plugin-html-keyboard-response@1.1.0"></script>
或者通过release中的plugin-html-keyboard-response.js
文件:
<script src="plugin-html-keyboard-response.js"></script>
这个时候就会有一个名为jsPsychHtmlKeyboardResponse
的全局变量,定义了对应的插件类。
如果要使用这个插件创建试次,就需要将这个类传入type
参数。插件类的命名以jsPsych
开始,后面跟上插件的名字,以驼峰法命名(不是用下划线连接单词)。更多示例详见"使用插件"部分。注意这个值 不是字符串 。
var trial = {
type: jsPsychHtmlKeyboardResponse,
stimulus: 'Hello, version 7.0!'
}
接受键盘反应的试次的choices
参数¶
接受键盘反应的试次的choices
参数不再支持jsPsych.NO_KEYS
和jsPsych.ALL_KEYS
了,它们现在分别改为"NO_KEYS"
和"ALL_KEYS"
这两个字符串。
例如,如果我们引入了audio-keyboard-response
插件,可以这样禁用被试输入:
var trial = {
type: jsPsychAudioKeyboardResponse,
choices: "NO_KEYS",
stimulus: 'example.ogg',
trial_ends_after_audio: true
}
使用扩展¶
和插件一样,扩展一样要通过类来引用。扩展的初始化在initJsPsych()
中进行,而不是在jsPsych.init()
中。扩展类的命名和插件类似,不过它们是以jsPsychExtension
开始的。
var jsPsych = initJsPsych({
extensions: [
{type: jsPsychExtensionWebgazer}
]
})
这些类可以在使用扩展的试次中使用。
var trial = {
type: jsPsychHtmlKeyboardResponse,
stimulus: 'Hello, version 7.0!',
extensions: [
{type: jsPsychExtensionWebgazer}
]
}
自定义插件¶
如果你想要将自己编写的插件升级到7.x版本,可以使用我们的插件模板。
新的插件模板中,插件通过类实现,但是核心的组成部分没有改变。
- 6.x版本中
plugin.info
中的内容需要被移到info
对象中。请注意,用来指定参数的type
属性在7.x版本中有些不同。这个对象需要是类的静态属性。 - 6.x版本中
plugin.trial
里的内容需要被移到类的trial
方法中。 - 新的模板中有一个
constructor()
函数,该函数需要接受一个jsPsych实例。这一部分代码不用修改。
以下这些改变可能会影响我们的插件:
- 我们移除了
registerPreload
函数,现在我们会通过info
对象中的type
参数,自动检测需要预加载多媒体文件。如果参数的类型为IMAGE
,AUDIO
, 或VIDEO
, 则会对其自动预加载。如果想要禁用预加载,可以将preload
设置为false
。 - 如果调用了jsPsych提供的函数,例如
jsPsych.finishTrial()
,请注意jsPsych
不再是一个全局变量了,我们需要用constructor中传入的jsPsych的索引。因此,我们需要在使用到jsPsych
的地方前面加上this.
,例如,jsPsych.finishTrial()
现在应该写成this.jsPsych.finishTrial()
。如果对jsPsych的调用在另一个函数内部,此时为了让this
关键字生效,需要使用JavaScript的箭头函数。 例如:Would be re-written as:function end_trial() { // ... jsPsych.finishTrial(data); }
const end_trial = () => { // ... this.jsPsych.finishTrial(data); }
需要帮助?¶
如果你在讲代码迁移到7.x版本的时候遇到了困难,可以寻求帮助。