jsPsychHtmlButtonResponse加载本地txt文件失败问题咨询
问题核心原因
两个插件对stimulus参数的预期输入完全不同,看似一致的写法逻辑本质不匹配:
jsPsychImageButtonResponse原生设计支持接收图片文件路径作为stimulus值,插件内部会自动生成<img>标签发起资源请求,所以直接传本地图片路径可以正常运行jsPsychHtmlButtonResponse的stimulus参数要求直接传入可渲染的HTML字符串,你传入的text_files/test.txt既不是合法HTML,也不会触发浏览器自动加载对应txt文件,自然无法正常展示。
可行处理方案
方案1:通过jsPsych预加载机制加载文本
利用jsPsych自带的预加载插件提前加载txt文件,试次运行时直接读取缓存的文本内容,拼接为HTML传入stimulus,是最符合jsPsych设计逻辑的方案:
// 实验初始化 const jsPsych = initJsPsych(); const timeline = []; // 预加载资源,将txt文件加入加载列表 const preload_trial = { type: jsPsychPreload, files: ['text_files/test.txt'] }; timeline.push(preload_trial); // 文本展示试次 const text_display = { type: jsPsychHtmlButtonResponse, stimulus: () => { const text_data = jsPsych.getPreloadedResource('text_files/test.txt'); // 外层div加样式保留txt原有换行、空格格式,控制阅读宽度 return `<div style="max-width: 800px; line-height: 1.7; white-space: pre-wrap; margin: 2rem auto;">${text_data}</div>`; }, choices: ["Ready"] }; timeline.push(text_display); jsPsych.run(timeline);
方案2:试次运行时动态fetch文本文件
如果不想提前预加载,可以在试次启动阶段用原生fetch接口请求本地txt文件,拿到内容后再渲染:
const text_display = { type: jsPsychHtmlButtonResponse, stimulus: '', choices: ["Ready"], on_start: async function(trial) { const resp = await fetch('text_files/test.txt'); const text_data = await resp.text(); trial.stimulus = `<div style="max-width: 800px; line-height: 1.7; white-space: pre-wrap; margin: 2rem auto;">${text_data}</div>`; } };
注意:该方案和预加载方案都要求你通过本地静态服务器运行实验(比如使用VS Code的Live Server插件、Python内置的http.server模块),直接双击打开本地HTML文件会触发浏览器跨域安全限制,导致文件加载失败。
方案3:直接内嵌文本内容
如果需要展示的文本篇幅短、不需要频繁修改,直接把文本内容拼接为HTML字符串传入stimulus即可,不需要额外加载外部文件,是最简单无依赖的方案:
const text_display = { type: jsPsychHtmlButtonResponse, stimulus: `<div style="max-width: 800px; line-height: 1.7; margin: 2rem auto;"> 这里直接填入需要展示的文本内容,支持嵌入任意HTML标签实现格式调整,比如加粗、分段、插入列表都可以正常渲染。 </div>`, choices: ["Ready"] };
内容的提问来源于stack exchange,提问作者CapsLock
相关产品推荐
相关产品推荐

