在Go模板中包含js文件
我最近开始学习Go。 我有一个像web应用程序的样本。 我有:
/* tick-tock.go */ package main import ( "fmt" "io/ioutil" "log" "net/http" ) // Content for the main html page.. var page = ` div { font-family: "Times New Roman", Georgia, Serif; font-size: 1em; width: 13.3em; padding: 8px 8px; border: 2px solid #2B1B17; color: #2B1B17; text-shadow: 1px 1px #E5E4E2; background: #FFFFFF; } Go Timer
var myDelay; $(document).ready(function () { $("#output").append("Waiting for system time.."); myDelay = setInterval("delayedPost()", 1000); }); function delayedPost() { $.post("http://localhost:9999/dev", "", function(data, status) { //$("#output").empty(); $("#output").prepend(data); }); $.post("http://localhost:9999/v1", "", function(data, status) { //$("#output").empty(); $("#v1").prepend(data); }); $.post("http://localhost:9999/v2", "", function(data, status) { //$("#output").empty(); $("#v2").prepend(data); }); } function delayedPost1() { $.post("http://localhost:9999/dev", "", function(data, status) { $("#output").prepend(data); }); $.post("http://localhost:9999/v1", "", function(data, status) { $("#v1").prepend(data); }); $.post("http://localhost:9999/v3", "", function(data, status) { $("#v2").prepend(data); }); } function changeUrl() { alert('salom'); clearInterval(myDelay); } ` // handler for the main page. func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprint(w, page) } // handler to cater AJAX requests func handlerDevs(w http.ResponseWriter, r *http.Request) { //fmt.Fprint(w, time.Now().Format("Mon, 02 Jan 2006 15:04:05 MST")) fmt.Fprint(w, "Dev1
") } func handlerV1(w http.ResponseWriter, r *http.Request) { //fmt.Fprint(w, time.Now().Format("Mon, 02 Jan 2006 15:04:05 MST")) fmt.Fprint(w, "Vertical1
") } func handlerV2(w http.ResponseWriter, r *http.Request) { //fmt.Fprint(w, time.Now().Format("Mon, 02 Jan 2006 15:04:05 MST")) fmt.Fprint(w, "Vertical2
") } func main() { http.HandleFunc("/", handler) http.HandleFunc("/dev", handlerDevs) http.HandleFunc("/v1", handlerV1) http.HandleFunc("/v2", handlerV2) log.Fatal(http.ListenAndServe(":9999", nil)) http.HandleFunc("/jquery.min.js", SendJqueryJs) panic(http.ListenAndServe(":8081", nil)) } func SendJqueryJs(w http.ResponseWriter, r *http.Request) { data, err := ioutil.ReadFile("jquery.min.js") if err != nil { http.Error(w, "Couldn't read file", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/javascript") w.Write(data) }
我无法加载本地jquery.min.js
。 当我写src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"
它已被加载。 如何加载本地js文件? 我不擅长Go中的编码而且我没有编写完整的代码。 所以请尽量解释一下。 提前致谢!
您需要Handler
或HandlerFunc
,它会在请求时将文件内容( jquery.min.js
)发送到Web浏览器。
你有3个选择:
手动做
这是更复杂的解决方案。 看起来在您的处理函数中,您读取文件的内容,设置正确的响应内容类型( application/javascript
)并将内容(这是[]byte
)发送到响应。
需要注意的事项:读取文件时,必须指定绝对路径。 如果指定相对路径,请确保该文件位于您启动应用程序的当前文件夹(工作目录)中。
例:
func SendJqueryJs(w http.ResponseWriter, r *http.Request) { data, err := ioutil.ReadFile("jquery.min.js") if err != nil { http.Error(w, "Couldn't read file", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/javascript; charset=utf-8") w.Write(data) } func main() { http.HandleFunc("/jquery.min.js", SendJqueryJs) panic(http.ListenAndServe(":8081", nil)) }
上面的示例只能为请求提供1个文件: jquery.min.js
:
http://localhost:8081/jquery.min.js
利用http.ServeFile()
这更容易:函数http.ServeFile()
能够将一个文件的内容发送到指定的响应。 您仍然需要创建一个函数或处理程序来使用它,但它会为您完成剩下的工作:
func SendJqueryJs(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "jquery.min.js") }
利用http.FileServer()
如果需要提供多个静态文件,这就是FileServer()
函数派上用场的地方,它会返回一个Handler
,它自动提供本地文件系统中的文件,这些文件是您指定的根文件夹的后代。
此解决方案更灵活:它可以发送多种类型的文件,自动检测和设置内容类型。 处理程序还能够呈现用于列出目录内容的HTML页面,其中包含指向文件和父/子文件夹的链接。
例:
http.Handle("/tmpfiles/", http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
这将在URL /tmpfiles/
注册一个Handler
,它在/tmp
文件夹中提供本地文件系统中的文件。 例如,以下链接:
将从服务器获取/tmp/jsquery.min.js
文件。
查看此答案,详细说明如何使用/启动静态文件服务器 。