You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HTML canvas元素无法被识别?jsPsych调用时getContext报错如何解决

问题根因

你遇到的报错是jsPsych的默认渲染逻辑导致的:调用jsPsych.init()时,默认会清空整个<body>标签下的所有原有DOM元素,你预先写在body里的<canvas id="myCanvas">在jsPsych开始运行 timeline 前就被删除了,所以stimulus回调执行时获取到的c是null,才触发了getContext相关报错。普通JS逻辑正常就是因为没有触发jsPsych的全局DOM清空操作。

解决方案

方案1:在stimulus回调中动态创建canvas(更符合jsPsych的设计规范)

不需要预先在body里写canvas标签,直接在回调中生成后交给jsPsych渲染,示例修改后的代码如下:

<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
        <script src="jspsych-6.3.1\jspsych.js"></script>
        <script src="jspsych-6.3.1\plugins\jspsych-html-button-response.js"></script>
        <link href="jspsych-6.3.1\css\jspsych.css" rel="stylesheet" type="text/css"/>
    </head>
    <body>
    <script>
        var finalTimeline = [];
        var example = {
            type: 'html-button-response',
            stimulus: function() {
                // 动态创建canvas元素
                var c = document.createElement("canvas");
                c.width = 200;
                c.height = 100;
                var ctx= c.getContext("2d");
                ctx.beginPath();
                ctx.arc(95, 50, 40, 0, 2 * Math.PI);
                ctx.stroke();
                // 返回canvas元素给jsPsych渲染到页面
                return c;
            }
        };
        finalTimeline.push(example);
        jsPsych.init({
            timeline: finalTimeline
        });
    </script>
    </body>
</html>

方案2:指定jsPsych的渲染容器,保留原有body内容

如果你需要保留预先写在页面里的canvas,可以在jsPsych.init中添加display_element参数,指定jsPsych只在某个固定容器内渲染内容,不会清空整个body:

  1. 先在body里新增一个专属的jsPsych渲染容器,保留原来的canvas:
<body>
    <canvas id="myCanvas" width="200" height="100"></canvas>
    <!-- 新增jsPsych专属渲染容器 -->
    <div id="jspsych-target"></div>
    <script>
        var finalTimeline = [];

        var example = {
            type: 'html-button-response',
            stimulus: function() {
                var c = document.getElementById("myCanvas");
                var ctx= c.getContext("2d");
                ctx.beginPath();
                ctx.arc(95, 50, 40, 0, 2 * Math.PI);
                ctx.stroke();
            }
        };
        finalTimeline.push(example);

        jsPsych.init({
            timeline: finalTimeline,
            // 指定渲染容器
            display_element: 'jspsych-target'
        });
    </script>
</body>

内容的提问来源于stack exchange,提问作者Guzzly Puzzly

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:09:00