首页
/ jsPsych 行为实验开发指南:从入门到专业的完整路径

jsPsych 行为实验开发指南:从入门到专业的完整路径

2026-04-10 09:39:54作者:龚格成

jsPsych 是一款专为浏览器环境设计的行为实验开发工具,通过 JavaScript 实现心理学、认知科学等领域的实验程序。本文将系统解析 jsPsych 的核心价值,提供从零开始的实战路径,并深入探讨高级应用技巧,帮助技术初学者快速掌握这一强大工具。

一、核心价值矩阵:为什么选择 jsPsych 开发行为实验?

1.1 无需后端环境,浏览器直接运行

传统实验软件往往需要复杂的安装配置,而 jsPsych 基于纯前端技术构建,只需浏览器即可运行,大大降低了实验部署门槛。研究者可以将实验直接部署到服务器,参与者通过链接即可访问,无需安装任何客户端软件。

1.2 毫秒级计时精度,满足行为研究需求

对于反应时实验,时间精度至关重要。jsPsych 提供可靠的毫秒级计时功能,确保实验数据的准确性。其内部时间戳机制能够精确记录刺激呈现、反应发生等关键时间点,为研究提供高质量数据支持。

1.3 丰富插件生态,覆盖各类实验范式

jsPsych 拥有完善的插件系统,涵盖从简单的键盘反应到复杂的眼动追踪等多种实验类型。每个插件都经过优化,确保在不同设备上的一致性表现,研究者可以根据需求灵活组合使用。

1.4 多设备自适应,扩大样本获取范围

随着移动设备的普及,跨平台兼容性变得越来越重要。jsPsych 自动适配桌面和移动设备,确保实验在不同屏幕尺寸和操作系统上都能正常运行,帮助研究者获取更广泛的样本数据。

jsPsych 调查插件在移动设备和桌面设备上的显示效果 图:jsPsych 调查插件自动适配移动设备(左)和桌面设备(右)的界面展示,确保实验在不同终端上的一致性体验。

二、场景化实战:从零构建完整行为实验

2.1 准备开发环境

首先克隆 jsPsych 仓库到本地:

git clone https://gitcode.com/gh_mirrors/js/jsPsych

项目结构中,examples/ 目录包含各类实验示例,docs/ 目录提供详细文档,packages/ 目录包含核心库和插件源代码。建议初学者先浏览这些目录,了解项目组织方式。

2.2 构建第一个实验:情绪识别任务

下面创建一个简单的情绪识别实验,参与者需要判断呈现面孔的情绪类型:

<!DOCTYPE html>
<html>
<head>
  <title>情绪识别实验</title>
  <script src="packages/jspsych/dist/jspsych.js"></script>
  <link rel="stylesheet" href="packages/jspsych/css/jspsych.css">
</head>
<body></body>
<script>
  // 定义实验刺激材料
  const stimuli = [
    { image: 'examples/img/happy_face_1.jpg', emotion: 'happy' },
    { image: 'examples/img/sad_face_1.jpg', emotion: 'sad' }
  ];
  
  // 创建实验时间线
  const timeline = [];
  
  // 欢迎页面
  const welcome = {
    type: 'html-keyboard-response',
    stimulus: `<h1>情绪识别实验</h1>
               <p>在本实验中,你将看到一系列人脸图片,请判断面孔的情绪类型。</p>
               <p>按空格键开始实验。</p>`,
    choices: [' ']
  };
  timeline.push(welcome);
  
  // 实验试次
  const trial = {
    type: 'image-keyboard-response',
    stimulus: jsPsych.timelineVariable('image'),
    choices: ['h', 's'],
    prompt: '<p>请判断情绪类型:H=开心,S=悲伤</p>',
    data: {
      correct_response: jsPsych.timelineVariable('emotion')
    },
    on_finish: function(data) {
      data.correct = (data.response === data.correct_response.charAt(0));
    }
  };
  
  // 创建试次循环
  const trial_procedure = {
    timeline: [trial],
    timeline_variables: stimuli,
    repetitions: 2,
    randomize_order: true
  };
  timeline.push(trial_procedure);
  
  // 结果反馈页面
  const results = {
    type: 'html-keyboard-response',
    stimulus: function() {
      const data = jsPsych.data.get().filter({correct: true});
      const accuracy = Math.round(data.count() / jsPsych.data.get().count() * 100);
      return `<h1>实验结束</h1>
              <p>你的正确率:${accuracy}%</p>
              <p>按任意键查看详细数据。</p>`;
    },
    choices: jsPsych.ALL_KEYS
  };
  timeline.push(results);
  
  // 初始化实验
  jsPsych.init({
    timeline: timeline,
    show_progress_bar: true,
    progress_bar_label: '实验进度',
    on_finish: function() {
      jsPsych.data.displayData();
    }
  });
</script>
</html>

2.3 添加进度条提升用户体验

进度条能帮助参与者了解实验进展,减少不确定性。在上述实验中,我们通过 show_progress_bar: true 启用了进度条功能。

jsPsych 实验进度表示例 图:带有进度条的情绪识别实验界面,顶部显示当前完成进度,帮助参与者了解实验剩余时间。

2.4 数据收集与导出

jsPsych 自动记录实验过程中的详细数据,包括反应时、按键反应、刺激信息等。实验结束后,可以通过多种方式导出数据:

// 导出为CSV格式
const csvData = jsPsych.data.get().csv();

// 保存数据到本地文件
jsPsych.data.get().localSave('csv', 'emotion_recognition_data.csv');

// 发送数据到服务器
fetch('/save-data', {
  method: 'POST',
  body: JSON.stringify(jsPsych.data.get().json()),
  headers: { 'Content-Type': 'application/json' }
});

三、深度应用:定制化与问题诊断

3.1 自定义实验样式

jsPsych 允许通过 CSS 自定义实验界面,以匹配研究需求或品牌风格。使用浏览器开发者工具可以方便地查看和修改元素样式。

使用开发者工具调试 jsPsych 样式 图:使用浏览器开发者工具查看和修改 jsPsych 实验元素样式,左侧为实验界面,右侧为对应的 HTML 和 CSS 代码。

创建自定义 CSS 文件并引入:

<link rel="stylesheet" href="custom-experiment.css">

在 CSS 文件中自定义样式:

/* 自定义刺激文本样式 */
.jspsych-stimulus {
  font-family: 'Arial', sans-serif;
  font-size: 24px;
  color: #333;
  margin-bottom: 20px;
}

/* 自定义按钮样式 */
.jspsych-btn {
  background-color: #4CAF50;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 16px;
}

.jspsych-btn:hover {
  background-color: #45a049;
}

3.2 实验流程控制

复杂实验往往需要条件分支和循环结构。jsPsych 提供了灵活的流程控制机制:

// 条件分支示例
const conditional_trial = {
  timeline: [difficult_trial],
  conditional_function: function() {
    // 获取前一个试次的正确率
    const last_trial = jsPsych.data.get().last(1).values()[0];
    // 如果正确率高于80%,则进入困难试次
    return last_trial.accuracy > 0.8;
  }
};

// 循环结构示例
const loop_node = {
  timeline: [practice_trial],
  loop_function: function(data) {
    // 练习直到连续3次正确
    const last_three = data.slice(-3);
    const all_correct = last_three.every(trial => trial.correct);
    return !all_correct; // 返回true将继续循环
  }
};

3.3 常见误区解析

误区1:忽视资源预加载

问题:实验中图片或音频加载缓慢,导致计时不准确。 解决:使用 preload 插件确保资源加载完成:

const preload = {
  type: 'preload',
  images: ['examples/img/happy_face_1.jpg', 'examples/img/sad_face_1.jpg'],
  message: '实验加载中,请稍候...'
};

误区2:过度依赖默认样式

问题:实验界面不符合研究需求或品牌形象。 解决:通过 CSS 自定义样式,或使用 css_classes 参数为特定试次添加样式类。

误区3:忽略移动设备兼容性

问题:实验在移动设备上显示异常或无法操作。 解决:使用 browser-check 插件检测设备兼容性,设计响应式刺激:

const browser_check = {
  type: 'browser-check',
  minimum_width: 320,
  minimum_height: 480,
  message: '您的设备屏幕太小,无法正常显示实验。请使用更大的设备访问。'
};

四、学习路径图:从入门到进阶

入门阶段

  1. 基础概念:阅读官方文档 docs/overview/timeline.md 了解时间线概念
  2. 核心插件:学习 docs/plugins/list-of-plugins.md 掌握常用插件功能
  3. 示例代码:运行 examples/demo-simple-rt-task.html 理解基本实验结构

中级阶段

  1. 数据处理:学习 docs/overview/data.md 掌握数据收集与分析方法
  2. 流程控制:参考 examples/conditional-and-loop-functions.html 实现复杂实验逻辑
  3. 样式定制:通过 docs/overview/style.md 学习界面美化技巧

高级阶段

  1. 插件开发:阅读 docs/developers/plugin-development.md 开发自定义插件
  2. 扩展功能:探索 docs/extensions/list-of-extensions.md 了解高级功能扩展
  3. 真实案例:研究 examples/real-world/ 目录中的实际实验项目

通过以上学习路径,你将逐步掌握 jsPsych 的核心功能和高级技巧,能够独立设计和实现专业的行为实验。记住,实践是学习的最佳方式,尝试修改示例代码,观察结果变化,不断积累经验。

jsPsych 作为一款开源工具,拥有活跃的社区支持和持续的更新迭代。定期查看项目文档和示例,参与社区讨论,你将能够充分利用这一强大工具开展自己的研究工作。

登录后查看全文
热门项目推荐
相关项目推荐