Go - 不呈现HTML注释

nov*_*ung 4 html go go-templates

我正在构建go web应用程序.我在渲染的html页面上发现了一些异常现象.我的所有html评论<!-- -->都突然没有被渲染.我的猜测是因为我使用的版本(刚刚更新到更高版本),因为在我更新它之前它很好.

这是我的代码:

<!-- prepare the breadcrumbs -->
<ul class="breadcrumb" data-bind="foreach: viewModel.breadcrumbs">
    <!-- ko if: ($index() + 1) < len(viewModel.breadcrumbs()) -->
    <li>
        <a data-bind="attr: { href: href }">
            <i class="fa fa-home"></i> 
            <span data-bind="text: title"></span>
        </a>
    </li>
    <!-- /ko -->

    <!-- ko if: ($index() + 1) == len(viewModel.breadcrumbs()) -->
    <li class="active" data-bind="text: title"></li>
    <!-- /ko -->
</ul>
Run Code Online (Sandbox Code Playgroud)

这是呈现的页面源:

在此输入图像描述

由于这个问题,我使用无容器控制流语法编写的许多KnockoutJS代码都很疯狂,它根本不起作用.

我该怎么做才能解决这个问题?提前致谢

icz*_*cza 11

html/template包装中有一种特殊的类型:template.HTML.呈现模板时,模板中此类型的值不会被转义.

因此,您可以将HTML注释"标记"为template.HTML,因此在执行模板期间不会转义或省略它们.

一种方法是为模板注册一个自定义函数,这个函数可以从模板中调用,该函数接受一个string参数并将其返回template.HTML.您可以将所有HTML注释"传递"到此函数,因此,HTML注释将保留在输出中.

看这个例子:

func main() {
    t := template.Must(template.New("").Funcs(template.FuncMap{
        "safe": func(s string) template.HTML { return template.HTML(s) },
    }).Parse(src))
    t.Execute(os.Stdout, nil)
}

const src = `<html><body>
{{safe "<!-- This is a comment -->"}}
<div>Some <b>HTML</b> content</div>
</body></html>`
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

<html><body>
<!-- This is a comment -->
<div>Some <b>HTML</b> content</div>
</body></html>
Run Code Online (Sandbox Code Playgroud)

所以基本上在注册我们的safe()函数之后,将所有HTML注释转换为调用此safe()函数并传递原始HTML注释的模板操作.

转换这个:

<!-- Some HTML comment -->
Run Code Online (Sandbox Code Playgroud)

对此:

{{safe "<!-- Some HTML comment -->"}}
Run Code Online (Sandbox Code Playgroud)

或者(无论你喜欢):

{{"<!-- Some HTML comment -->" | safe}}
Run Code Online (Sandbox Code Playgroud)

你很高兴去.

注意:如果HTML注释包含引号('"'),则可以/必须像这样转义:

{{safe "<!-- Some \"HTML\" comment -->"}}
Run Code Online (Sandbox Code Playgroud)

注意#2:请注意,您不应该使用条件HTML注释,因为这可能会破坏上下文敏感的html/template包转义.详情请阅读此内容.