我有一个简单的Go HTML模板,其中包含HTML条件注释:
package main
import (
"html/template"
"os"
)
var body = `<!doctype html>
<html>
<head>
<!--[if !IE]><!--><script src="http://code.jquery.com/jquery-2.0.3.min.js"></script><!--<![endif]-->
<!--[if gte IE 9]><script src="http://code.jquery.com/jquery-2.0.3.min.js"></script><![endif]-->
<!--[if lt IE 9]><script src="http://code.jquery.com/jquery-1.10.2.min.js"></script><![endif]-->
</head>
</html>`
func main() {
tmp := template.Must(template.New("tmp").Parse(body))
tmp.Execute(os.Stdout, nil)
}
<!doctype html>
<html>
<head>
<script src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
</head>
</html>
为什么html/template
在编译后会删除这些条件注释?
答案 0 :(得分:9)
我的解决方法是重新实现在提交#938597eab997
上删除的 noescape 帮助程序funcMap := template.FuncMap{
"noescape": func(s string) template.HTML {
return template.HTML(s)
},
}
然后在模板中使用它:
<!DOCTYPE html>
{{noescape "<!--[if lt IE 9]>"}}<html class="old-ie">{{noescape "<![endif]-->"}}
答案 1 :(得分:5)
由于你的问题是为什么,我会尝试解释为什么评论会被删除。
首先,html/template
包的目的是安全。 documentation州:
包模板(html / template)实现了数据驱动模板,用于生成HTML输出,以防止代码注入。
这是通过上下文敏感的转义来完成的。在Golang-nuts thread Kyle Lemons中提供了一个例子,除非评论被删除,否则条件评论目前会破坏这种安全性:
<p>
<!--[if lt IE 9]><script><![endif]-->
{{.Stuff}}
<!--[if lt IE 9]></script><![endif]-->
</p>
在这种情况下,{{.Stuff}}中的任何值都将在某些浏览器上作为Javascript执行,因此应该转义为安全的。这将要求模板引擎知道注释的这种特定于浏览器的解释,以及所有浏览器中的任何其他非标准行为。这是不可行的。
相反,html/template
旨在消除任何评论,以确保它产生的HTML不会受到任何注入攻击。
解决方法强>
如Dave所述,可以使用template.HTML
插入此类注释。但是,由于存在安全风险,template.HTML
状态documentation(我强调):
HTML封装了一个已知的安全HTML文档片段。它不应该用于来自第三方的HTML,或者带有未关闭标签的HTML或评论。
答案 2 :(得分:1)
看来golang-nuts集团讨论了这个问题:
https://groups.google.com/forum/#!msg/golang-nuts/8y6by6SERyU/XQRnbw3aBhwJ
TL; DR
转到所有html通知的html/template
条,并且不解释条件注释,因为它们不是标准的一部分。
此外,{{noescape}}
指令已被删除:http://code.google.com/p/go/issues/detail?id=3528
答案 3 :(得分:0)
条件评论仅受Internet Explorer支持,不属于我能找到的任何标准。
来自Wikipedia:
条件注释是Microsoft Internet Explorer在HTML源代码中解释的条件语句。条件注释可用于在Internet Explorer中提供和隐藏代码。
HTML [1]中的条件注释首先出现在Microsoft的Internet Explorer 5浏览器中,尽管现已不再支持。在Internet Explorer 10中,当页面处于标准模式(文档模式10)时,不支持HTML条件注释
答案 4 :(得分:0)
添加几个将HTML注释添加到html / template输出的示例:
1)使用HTML类型添加评论: http://play.golang.org/p/mYj4rxVfHW
2)使用添加的noescape函数(返回HTML): http://play.golang.org/p/y61Hysfs3Y