How to add an HTML Tag Attribute in GoLang Template

huangapple go评论126阅读模式
英文:

How to add an HTML Tag Attribute in GoLang Template

问题

我有以下代码:

{{range . }}
    <td {{ if not .IsDisabled }}onclick="return toggle_active($(this))"{{ end }}>
      [x]
    </td>
{{end}}

这段代码可以正常工作,它会正确地添加 onclick 事件。

然而,如果我尝试将 onclick 事件作为字符串动态创建(无论是在模板中还是作为 Go 函数),它就不起作用了。

例如:

{{$clickEvent := "return toggle_active($(this));"}}
<td {{$clickEvent}}>[x]</td>

或者:

func (d TemplateObject) Click() string {
    return "onclick=\"toggle_active($(this))\""
}

<td {{.Click}}>[x]</td>

在 HTML 中,它会呈现如下:

How to add an HTML Tag Attribute in GoLang Template

如果我不将它放在 <tag> 本身中,而是像这样打印字符串 {{$ClickEvent}},它会将其作为字符串输出。

如何才能正确呈现属性?

英文:

I have the following code:

{{range . }}
    &lt;td {{ if not .IsDisabled }}onclick=&quot;return toggle_active($(this))&quot;{{ end }}&gt;
      [x]
    &lt;/td&gt;
{{end}}

This works, it puts the onclick event like it should.

However, if I try to create the onclick event dynamically as a string (either in the template, or as a Go function, it doesn't work.

Example:

{{$clickEvent := &quot;return toggle_active($(this));&quot;}}
&lt;td {{$clickEvent}}&gt;[x]&lt;/td&gt;

Or:

func (d TemplateObject) Click() string {
	return &quot;onclick=\&quot;toggle_active($(this))\&quot;&quot;
}

&lt;td {{.Click}}&gt;[x]&lt;/td&gt;

It renders it like this in the HTML:

How to add an HTML Tag Attribute in GoLang Template

If I don't put it in the &lt;tag&gt; itself &lt;td&gt;{{$ClickEvent}}&lt;/td&gt; it prints it as a string.

How can I get the attribute to render correctly?

答案1

得分: 2

你需要将以下代码进行翻译:

func (d TemplateObject) Click() template.HTMLAttr {
    return "onclick=\"toggle_active($(this))\""
}

这样它就知道该字符串可以安全地用作属性。

https://pkg.go.dev/html/template#HTMLAttr

HTMLAttr 封装了来自可信源的 HTML 属性,例如 dir="ltr"
使用此类型存在安全风险:封装的内容应来自可信源,因为它将原样包含在模板输出中。

英文:

You need to do

func (d TemplateObject) Click() template.HTMLAttr {
    return &quot;onclick=\&quot;toggle_active($(this))\&quot;&quot;
}

so that it knows the string is safe to use as an attribute

https://pkg.go.dev/html/template#HTMLAttr

> HTMLAttr encapsulates an HTML attribute from a trusted source, for example, dir=&quot;ltr&quot;.
> Use of this type presents a security risk: the encapsulated content should come from a trusted source, as it will be included verbatim in the template output.

huangapple
  • 本文由 发表于 2023年1月21日 04:40:05
  • 转载请务必保留本文链接:https://go.coder-hub.com/75189133.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定