dtmjl4427 2015-03-06 13:22
浏览 68
已采纳

在Go模板中包含js文件

I started learning Go recently. I got a sample like as web app. I have:

/* tick-tock.go */
package main

import (
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
)

// Content for the main html page..
var page = `<html>
           <head>
             <script type="text/javascript"
               src="http://localhost:8081/jquery.min.js">
             </script>
             <style> 
               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;
               }
             </style>
           </head>
           <body>
             <h2 align=center>Go Timer </h2>
             <div id="output" style="width: 30%; height: 63%; overflow-y: scroll; float:left;"></div>
             <div id="v1" style="width: 50%; height: 30%; overflow-y: scroll; float:left;"></div>
             <div id="v2" style="width: 50%; height: 30%; overflow-y: scroll; float:left;"></div>
             <input id="sett" type="submit" name="sett" value="Settings" onclick="changeUrl()">

             <script type="text/javascript">

               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);



               }

             </script>
           </body>
         </html>`

// 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, "<font color=red>Dev1<br></font>")
}

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, "<font color=blue>Vertical1<br></font>")
}

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, "<font color=green>Vertical2<br></font>")
}

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)
}

I couldn't load local jquery.min.js. When I wrote src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" it was loaded. How can I load local js file? I am not good at coding in Go and I did not write full code. So please try to explain very simple. Thanks in advance!

  • 写回答

1条回答 默认 最新

  • duanji9677 2015-03-06 13:27
    关注

    You need a Handler or a HandlerFunc which will send the file content (jquery.min.js) to the web browser when requested.

    You have 3 options:

    Doing It Manually

    This is the more complex solution. It would look like in your handler function you read the content of the file, set proper response content type (application/javascript) and send the content (which is a []byte) to the response.

    Things to look out for: When reading the file, you have to specify an absolute path. If you specify a relative path, be sure the file is in the current folder (working directory) you start your app from.

    Example:

    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))
    }
    

    The above example is capable of serving only 1 file: jquery.min.js for the request:

    http://localhost:8081/jquery.min.js
    

    Utilizing http.ServeFile()

    This is much easier: The function http.ServeFile() is capable of sending the content of one file to the specified response. You still need to create a function or handler to use it, but it does the rest for you:

    func SendJqueryJs(w http.ResponseWriter, r *http.Request) {
        http.ServeFile(w, r, "jquery.min.js")
    }
    

    Utilizing http.FileServer()

    If you need to serve multiple static files, this is where FileServer() function comes handy which returns you a Handler which automatically serves files from your local file system that are descendants of the root folder you specify.

    This solution is much more flexible: it can send many files of multiple types, detects and sets content type automatically. The handler is also capable of rendering HTML pages for listing directory content with links to the files and to parent/child folders.

    Example:

    http.Handle("/tmpfiles/",
        http.StripPrefix("/tmpfiles/", http.FileServer(http.Dir("/tmp"))))
    

    This will register a Handler at the URL /tmpfiles/ which serves files found in your local filesystem in the /tmp folder. So for example the following <script> link:

    <script type="text/javascript" src="/tmpfiles/jquery.min.js">
    

    Will get the /tmp/jsquery.min.js file from the server.

    Check out this answer which details how to use/fire up a Static File Server.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算