Go - HTML 评论未呈现
Go - HTML comments are not rendered
我正在构建 go web 应用程序。我在呈现的 html 页面上发现了一些异常。我的所有 html 评论 <!-- -->
突然都没有呈现。我猜是因为我用的go版本(刚更新到高版本),因为我更新之前没问题
这是我的代码:
<!-- 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>
这是呈现的页面源代码:
由于这个问题,我的许多使用无容器控制流语法编写的 KnockoutJS 代码变得疯狂,根本不起作用。
我应该怎么做才能解决这个问题?提前致谢
您可以使用 text/template
而不是 html/template
并使用 html
和 js
(https://golang.org/pkg/text/template/#hdr-Functions) 等内置函数手动转义.请注意,这很容易出错。
html/template
package: template.HTML
中有一个特殊类型。呈现模板时不会转义模板中此类型的值。
因此您可以 "mark" 您的 HTML 注释为 template.HTML
这样它们在执行您的模板时不会被转义或省略。
实现此目的的一种方法是为您的模板注册一个自定义函数,该函数可以从您的模板调用,该函数接受一个 string
参数和 returns 作为 template.HTML
.您可以 "pass" 对此函数的所有 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>`
输出(在 Go Playground 上尝试):
<html><body>
<!-- This is a comment -->
<div>Some <b>HTML</b> content</div>
</body></html>
所以基本上在注册我们的 safe()
函数之后,将所有 HTML 评论转换为调用此 safe()
函数并传递原始 HTML 评论的模板操作。
转换为:
<!-- Some HTML comment -->
为此:
{{safe "<!-- Some HTML comment -->"}}
或者(随你喜欢):
{{"<!-- Some HTML comment -->" | safe}}
你可以开始了。
注意:如果你的HTML评论包含引号('"'
),你可以/必须像这样转义它:
{{safe "<!-- Some \"HTML\" comment -->"}}
注意 #2: 请注意,您不应使用条件 HTML 注释,因为这可能会破坏 html/template
包的上下文敏感转义。有关详细信息,请阅读 this。
我正在构建 go web 应用程序。我在呈现的 html 页面上发现了一些异常。我的所有 html 评论 <!-- -->
突然都没有呈现。我猜是因为我用的go版本(刚更新到高版本),因为我更新之前没问题
这是我的代码:
<!-- 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>
这是呈现的页面源代码:
由于这个问题,我的许多使用无容器控制流语法编写的 KnockoutJS 代码变得疯狂,根本不起作用。
我应该怎么做才能解决这个问题?提前致谢
您可以使用 text/template
而不是 html/template
并使用 html
和 js
(https://golang.org/pkg/text/template/#hdr-Functions) 等内置函数手动转义.请注意,这很容易出错。
html/template
package: template.HTML
中有一个特殊类型。呈现模板时不会转义模板中此类型的值。
因此您可以 "mark" 您的 HTML 注释为 template.HTML
这样它们在执行您的模板时不会被转义或省略。
实现此目的的一种方法是为您的模板注册一个自定义函数,该函数可以从您的模板调用,该函数接受一个 string
参数和 returns 作为 template.HTML
.您可以 "pass" 对此函数的所有 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>`
输出(在 Go Playground 上尝试):
<html><body>
<!-- This is a comment -->
<div>Some <b>HTML</b> content</div>
</body></html>
所以基本上在注册我们的 safe()
函数之后,将所有 HTML 评论转换为调用此 safe()
函数并传递原始 HTML 评论的模板操作。
转换为:
<!-- Some HTML comment -->
为此:
{{safe "<!-- Some HTML comment -->"}}
或者(随你喜欢):
{{"<!-- Some HTML comment -->" | safe}}
你可以开始了。
注意:如果你的HTML评论包含引号('"'
),你可以/必须像这样转义它:
{{safe "<!-- Some \"HTML\" comment -->"}}
注意 #2: 请注意,您不应使用条件 HTML 注释,因为这可能会破坏 html/template
包的上下文敏感转义。有关详细信息,请阅读 this。