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

Streamlit按钮首次点击弹窗正常,后续点击失效问题求助

解决Streamlit按钮多次触发弹窗的问题

问题原因

你当前代码里给window.open()指定了固定窗口名称mozillaWindow,浏览器会复用这个名称对应的窗口:

  • 第一次点击会新建弹窗
  • 后续点击只会聚焦到已打开的该窗口;如果窗口被关闭,浏览器可能仍保留该窗口的引用,导致无法重新触发弹窗

解决方案

方案1:移除固定窗口名,让浏览器自动分配

修改window.open()参数,去掉固定窗口名,每次点击都会新建弹窗(窗口关闭后也能重新打开):

import streamlit as st
from streamlit.components.v1 import html

def open_page(url):
    open_script= """
        <script type="text/javascript">
            // 不指定固定窗口名,浏览器自动生成唯一标识
            window.open('%s', '_blank', "popup").focus();
        </script>
    """ % (url)
    html(open_script)

st.button('test', on_click=open_page, args=('https://www.mozilla.org/',))

方案2:生成动态唯一窗口名

如果需要控制弹窗唯一性(同一URL仅打开一个,但关闭后可重新打开),用时间戳生成每次点击的唯一窗口名:

import streamlit as st
from streamlit.components.v1 import html
import time

def open_page(url):
    # 用时间戳生成唯一窗口名,避免复用旧窗口引用
    window_name = f"popup_{int(time.time() * 1000)}"
    open_script= """
        <script type="text/javascript">
            const newWindow = window.open('%s', '%s', "popup");
            if (newWindow) {
                newWindow.focus();
            } else {
                alert('弹窗被浏览器拦截,请允许弹窗权限');
            }
        </script>
    """ % (url, window_name)
    html(open_script)

st.button('test', on_click=open_page, args=('https://www.mozilla.org/',))

方案3:保留窗口名但判断窗口状态

如果希望复用窗口(已打开则聚焦,关闭则新建),可以先检查窗口是否存在:

import streamlit as st
from streamlit.components.v1 import html

def open_page(url):
    open_script= """
        <script type="text/javascript">
            let popupWindow = window.open('', 'mozillaWindow');
            // 检查窗口是否已关闭
            if (popupWindow && !popupWindow.closed) {
                popupWindow.focus();
            } else {
                popupWindow = window.open('%s', 'mozillaWindow', "popup");
                popupWindow.focus();
            }
        </script>
    """ % (url)
    html(open_script)

st.button('test', on_click=open_page, args=('https://www.mozilla.org/',))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:29:54