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

如何将JavaScript变量传递给Flask的SocketIO函数?

解决方法

1. 修改前端JavaScript代码,传递参数到后端

你需要在调用socket.emit时把text作为参数一起发送,同时要确保每个按钮能获取到对应列表项的内容,把text的获取放在按钮点击事件的作用域内:

function createSpan() {
    var c = 1
    for (let i of document.getElementsByTagName('li')) {
        var span = document.createElement('span');
        span.id = 'outlineSpan'
        var clonedLI = i.cloneNode(true);
        span.appendChild(clonedLI);
        console.log(i.innerHTML)
        var genNotesBtn = document.createElement('button');
        genNotesBtn.className = 'genNotesBtn';
        genNotesBtn.id = 'genNotesBtn' + c;
        c++;
        genNotesBtn.innerHTML = 'Generate notes.';
        // 保存当前列表项的内容到变量
        const text = i.innerHTML;
        genNotesBtn.onclick = function() {
            // 发送SocketIO事件时带上text参数
            socket.emit('notesGen', text)
        }
        span.appendChild(genNotesBtn);
        i.parentNode.replaceChild(span, i);
    }
}

2. 修改后端Flask SocketIO代码,接收参数

后端的notesGen函数只需添加对应参数,就能直接接收前端传来的text值:

@socketio.on('notesGen')
def notesGen(subheading):  # 这里的subheading就是前端传来的text
    assistantID = notesGenAssistant()
    # 现在subheading已获取到前端的动态值
    notesGenThread(subheading, detail)
    notesGenRun(assistantID, threadid)

为什么之前的方法无效

你尝试的var text = '{{ subheading }}'是Jinja2模板语法,这种语法是服务器渲染页面时执行的,而i.innerHTML是客户端浏览器运行JavaScript时才生成的动态内容,服务器渲染页面时根本无法预知这个值,所以不能通过模板语法传递。必须用SocketIO的事件参数来传递客户端的动态数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:42:43