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
相关产品推荐
相关产品推荐

