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

Pug模板渲染传递的参数无法在onclick事件中访问如何解决

错误原因

你之前的推测不正确,问题根源不是事件绑定时机早于参数传递,而是Pug 模板的渲染上下文和前端浏览器的 JS 运行上下文是完全隔离的两个环境。你通过res.render传递的testvar默认只能在 Pug 模板的渲染逻辑中使用,写在script(type="text/javascript").后的内容属于前端静态 JS 代码,Pug 会直接原样输出到最终的 HTML 中,不会自动把模板变量注入到前端 JS 作用域里,所以前端运行时自然找不到testvar变量。


解决方法

方法1:直接将模板变量注入前端JS作用域

通过Pug的非转义输出语法!{},把模板变量序列化后写入前端JS代码中,推荐用JSON.stringify处理变量,可以兼容字符串、数字、布尔值、普通对象等多种类型,也避免手动处理引号的问题。

修改你的test.pug的script部分即可:

script(type="text/javascript").
    // 将Pug模板变量注入前端全局作用域
    const testvar = !{JSON.stringify(testvar)};
    window.addEventListener('DOMContentLoaded', function(){
        document.getElementById('play-button').addEventListener('click', async () => {
            console.log(testvar);
            console.log('ready');
        });
    }, false);

如果传递的变量包含用户输入内容,建议提前做XSS过滤再输出。


方法2:将变量挂载到DOM自定义属性

如果不想污染全局作用域,可以把参数存在DOM元素的自定义data-*属性上,前端JS通过DOM的dataset属性读取。

第一步修改按钮的Pug代码,添加自定义属性:

button(type = 'button' id = 'play-button' data-testvar=testvar) Click to play

第二步修改前端点击事件的代码,从DOM属性读取参数:

script(type="text/javascript").
    window.addEventListener('DOMContentLoaded', function(){
        document.getElementById('play-button').addEventListener('click', async (e) => {
            const testvar = e.target.dataset.testvar;
            console.log(testvar);
            console.log('ready');
        });
    }, false);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:45:03