Golang中如何为另一个模板添加"open"类
Golang中如何为另一个模板添加"open"类 我正在使用Go模板,并尝试使用一个主菜单和几个子菜单。子菜单附加在窗口上。

通过将子菜单附加到窗口,我无法从另一个窗口发送“open”状态。

因为当新窗口打开时,类会被刷新。

“open”类将在新窗口中被重置。
有没有办法通过JavaScript向另一个模板传递参数?“全局变量”仅属于当前窗口。
欢迎任何建议或完全不同的思路!
更多关于Golang中如何为另一个模板添加"open"类的实战教程也可以访问 https://www.itying.com/category-94-b0.html
Sibert:
从另一个窗口发送一个“打开”操作
你这是什么意思?
Go 模板与在浏览器中运行的 JavaScript 无关。
更多关于Golang中如何为另一个模板添加"open"类的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
lutzhorn:
你这是什么意思?
Go 模板与在浏览器中运行的 JavaScript 无关。
除了使用 JavaScript 和 CSS 来“打开”一个 <div> 之外,我不知道还有其他方法。使用 Go 有其他的方式吗?
在Go模板中实现跨窗口的类状态管理,可以通过以下几种技术方案:
方案一:使用URL参数传递状态
// Go模板部分
<a href="/menu?submenu=open" target="_blank">打开子菜单</a>
// 在目标窗口模板中
{{if eq .Submenu "open"}}
<div class="submenu open">
{{else}}
<div class="submenu">
{{end}}
<!-- 子菜单内容 -->
</div>
// Go处理程序
func menuHandler(w http.ResponseWriter, r *http.Request) {
submenu := r.URL.Query().Get("submenu")
tmpl.Execute(w, map[string]interface{}{
"Submenu": submenu,
})
}
方案二:使用localStorage同步状态
<!-- 主窗口模板 -->
<script>
function openSubMenu() {
localStorage.setItem('submenuOpen', 'true');
window.open('/submenu', '_blank');
}
</script>
<button onclick="openSubMenu()">打开子菜单</button>
<!-- 子菜单窗口模板 -->
<script>
window.addEventListener('load', function() {
const isOpen = localStorage.getItem('submenuOpen');
if (isOpen === 'true') {
document.querySelector('.submenu').classList.add('open');
localStorage.removeItem('submenuOpen'); // 清理状态
}
});
</script>
<div class="submenu">
<!-- 子菜单内容 -->
</div>
方案三:使用BroadcastChannel API(现代浏览器)
<!-- 主窗口 -->
<script>
const channel = new BroadcastChannel('menu-channel');
function openSubMenu() {
channel.postMessage({ action: 'openSubmenu' });
window.open('/submenu', '_blank');
}
</script>
<!-- 子菜单窗口 -->
<script>
const channel = new BroadcastChannel('menu-channel');
channel.onmessage = function(event) {
if (event.data.action === 'openSubmenu') {
document.querySelector('.submenu').classList.add('open');
}
};
</script>
方案四:使用PostMessage进行窗口间通信
// 主窗口模板
<script>
let submenuWindow = null;
function openSubMenu() {
submenuWindow = window.open('/submenu', 'submenu');
}
// 监听子菜单状态变化
window.addEventListener('message', function(event) {
if (event.data.type === 'submenuStatus') {
console.log('子菜单状态:', event.data.open);
}
});
</script>
// 子菜单窗口模板
<script>
// 通知父窗口状态
window.opener.postMessage({
type: 'submenuStatus',
open: true
}, '*');
// 接收父窗口指令
window.addEventListener('message', function(event) {
if (event.data.command === 'toggleMenu') {
document.querySelector('.submenu').classList.toggle('open');
}
});
</script>
方案五:使用WebSocket实时同步(需要后端支持)
// Go WebSocket服务器
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
conn, _ := upgrader.Upgrade(w, r, nil)
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
return
}
// 广播消息给所有连接的客户端
if string(p) == `{"action":"openSubmenu"}` {
broadcastToAll(messageType, p)
}
}
}
<!-- 客户端模板 -->
<script>
const ws = new WebSocket('ws://localhost:8080/ws');
ws.onmessage = function(event) {
const data = JSON.parse(event.data);
if (data.action === 'openSubmenu') {
document.querySelector('.submenu').classList.add('open');
}
};
</script>
推荐方案
对于简单的跨窗口状态同步,推荐使用方案二(localStorage),因为它实现简单且兼容性好。如果需要在多个窗口间进行复杂的通信,可以使用方案四(PostMessage)。
// 完整的localStorage方案示例
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
tmpl := template.Must(template.ParseFiles("main.html"))
tmpl.Execute(w, nil)
})
http.HandleFunc("/submenu", func(w http.ResponseWriter, r *http.Request) {
tmpl := template.Must(template.ParseFiles("submenu.html"))
tmpl.Execute(w, nil)
})
http.ListenAndServe(":8080", nil)
}
这些方案都能解决跨窗口模板类状态同步的问题,具体选择取决于你的应用场景和浏览器兼容性要求。

