Golang中HTML提交按钮的问题如何解决
Golang中HTML提交按钮的问题如何解决 你好,我似乎无法让代码在使用模板的提交按钮上正常工作。文本似乎会显示为上一次点击的内容,而不是最新的点击,而且函数在每次点击时似乎会运行两次。我哪里做错了?
我使用的 Go 代码如下:
Package main
import (
"text/template"
"log"
"net/http"
"fmt"
)
var modeType string = ""
type PageVariables struct {
Mode string
}
func whatPressed(w http.ResponseWriter, r *http.Request) {
HomePageVars := PageVariables{
Mode: modeType,
}
t, _ := template.ParseFiles("test1.html")
t.Execute(w, HomePageVars)
r.ParseForm()
if _, exist := r.Form["normal"]; exist { modeType = "Normal Mode"}
if _, exist := r.Form["insert"]; exist { modeType = "Insert Mode"}
if _, exist := r.Form["edit"]; exist { modeType = "Edit Mode"}
fmt.Println("Pressed")
fmt.Println(r.Form)
}
func main() {
http.HandleFunc("/", whatPressed) // setting router rule
err := http.ListenAndServe(":8080", nil) // setting listening port
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
我使用的模板 - test1.html - 如下:
<table bgcolor="#ffffff" width=800>
<tr>
<td width="20%" align=left><form method=post><input type="hidden" name="edit" value="1"><input type="submit" value="Edit"></form></td>
<td width="20%" align=left><form method=post><input type="hidden" name="insert" value="1"><input type="submit" value="Insert"></form></td>
<td width="20%" align=left><form method=post><input type="hidden" name="normal" value="1"><input type="submit" value="Normal"></form></td>
<td width="20%" align=left> </td>
</tr>
</table>
<br><br><p>{{.Mode}} has been clicked on</p>
非常感谢。
更多关于Golang中HTML提交按钮的问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
5 回复
有时,问题是由浏览器缓存的旧版本JavaScript文件引起的,可以通过清除浏览器缓存来解决。 您可以使用浏览器的控制台进行调试。修复JavaScript错误后,提交按钮将自动启用。

你能解释一下这几行代码是如何工作的吗?这样我理解起来会更容易。 如果你有任何想法,请继续说明以帮助他人。 谢谢。
嗨 Dunsfold,HomePageVars 应该在表单存在性检查中为 modeType 赋值之后进行声明。这就是为什么你首先会得到一个空字符串值,并且你在表单操作之前就执行了模板。以下是 whatPressed 函数中的代码实现:
func whatPressed(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
if _, exist := r.Form["normal"]; exist { modeType = "Normal Mode" }
if _, exist := r.Form["insert"]; exist { modeType = "Insert Mode" }
if _, exist := r.Form["edit"]; exist { modeType = "Edit Mode" }
HomePageVars := PageVariables{
Mode: modeType,
}
fmt.Println("Pressed")
fmt.Println(r.Form)
t, _ := template.ParseFiles("test1.html")
t.Execute(w, HomePageVars)
}
你的代码存在两个主要问题:1) 执行顺序错误导致数据滞后 2) 表单处理逻辑有缺陷。以下是修正后的代码:
package main
import (
"html/template"
"log"
"net/http"
)
type PageVariables struct {
Mode string
}
func whatPressed(w http.ResponseWriter, r *http.Request) {
var modeType string
// 先处理POST请求,再渲染模板
if r.Method == http.MethodPost {
r.ParseForm()
if _, exist := r.Form["normal"]; exist {
modeType = "Normal Mode"
}
if _, exist := r.Form["insert"]; exist {
modeType = "Insert Mode"
}
if _, exist := r.Form["edit"]; exist {
modeType = "Edit Mode"
}
}
HomePageVars := PageVariables{
Mode: modeType,
}
t, err := template.ParseFiles("test1.html")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
t.Execute(w, HomePageVars)
}
func main() {
http.HandleFunc("/", whatPressed)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
模板文件test1.html保持不变:
<table bgcolor="#ffffff" width=800>
<tr>
<td width="20%" align=left><form method=post><input type="hidden" name="edit" value="1"><input type="submit" value="Edit"></form></td>
<td width="20%" align=left><form method=post><input type="hidden" name="insert" value="1"><input type="submit" value="Insert"></form></td>
<td width="20%" align=left><form method=post><input type="hidden" name="normal" value="1"><input type="submit" value="Normal"></form></td>
<td width="20%" align=left> </td>
</tr>
</table>
<br><br><p>{{.Mode}} has been clicked on</p>
主要修改:
- 移除了全局变量
modeType,改为函数内局部变量 - 将
r.ParseForm()移到模板渲染之前 - 添加了HTTP方法检查
r.Method == http.MethodPost - 将
text/template改为html/template以获得更好的HTML转义 - 添加了模板解析错误处理
这样修改后,点击按钮会立即显示当前点击的模式,且函数只执行一次。

