查看源代码 Phoenix.HTML (Phoenix.HTML v4.1.1)
在 Phoenix 中使用 HTML 的构建块。
该库提供了三个主要功能
- HTML 安全
- 表单抽象
- 一个微型的 JavaScript 库,用于增强应用程序
HTML 安全
该包的主要职责之一是提供用于转义和标记 HTML 代码为安全的便捷函数。
默认情况下,模板中输出的数据不被认为是安全的
<%= "<hello>" %>
将显示为
<hello>
用户数据或来自数据库的数据几乎从不被认为是安全的。但是,在某些情况下,您可能希望将其标记为安全并显示其“原始”内容
<%= raw "<hello>" %>
表单处理
JavaScript 库
该项目附带了少量 JavaScript,它监听所有点击事件以
支持
data-confirm="message"
属性,它会显示一个包含给定消息的确认模态框支持
data-method="patch|post|put|delete"
属性,它会将当前点击作为 PATCH/POST/PUT/DELETE HTTP 请求发送。您需要添加data-to
和 URL 以及data-csrf
和 CSRF 令牌值分派 "phoenix.link.click" 事件。您可以监听此事件以自定义上述行为。从该事件返回 false 将禁用
data-method
。阻止传播将禁用data-confirm
要使用上述功能,您必须将 priv/static/phoenix_html.js
加载到您的构建工具中。
覆盖默认确认行为
您可以通过挂钩到 phoenix.link.click
来覆盖默认实现。以下是一个示例
window.addEventListener('phoenix.link.click', function (e) {
// Introduce custom behaviour
var message = e.target.getAttribute("data-prompt");
var answer = e.target.getAttribute("data-prompt-answer");
if(message && answer && (answer != window.prompt(message))) {
e.preventDefault();
}
}, false);
摘要
函数
转义属性的枚举,返回 iodata。
转义给定项中的 HTML 实体,返回安全的 iodata。
转义要插入 JavaScript 字符串的 HTML 内容。
将给定内容标记为原始内容。
将安全结果转换为字符串。
类型
函数
转义属性的枚举,返回 iodata。
属性按给定顺序呈现。注意,如果给定映射,则无法保证键顺序。
键和值可以是任何形状,只要它们实现 Phoenix.HTML.Safe
协议。此外,如果键是原子,它将被“破折号化”。换句话说,:phx_value_id
将转换为 phx-value-id
。
此外,以下属性提供行为
:aria
、:data
和:phx
- 它们接受关键字列表作为值。data: [confirm: "are you sure?"]
转换为data-confirm="are you sure?"
。:class
- 它接受一个类列表作为参数。列表中的每个元素都用空格隔开。nil
和false
元素将被丢弃。class: ["foo", nil, "bar"]
然后变为class="foo bar"
。:id
- 如果给定数字作为 ID,则会验证并引发异常,这是 HTML 规范不允许的,并且会导致不可预测的行为。
示例
iex> safe_to_string attributes_escape(title: "the title", id: "the id", selected: true)
" title=\"the title\" id=\"the id\" selected"
iex> safe_to_string attributes_escape(%{data: [confirm: "Are you sure?"]})
" data-confirm=\"Are you sure?\""
iex> safe_to_string attributes_escape(%{phx: [value: [foo: "bar"]]})
" phx-value-foo=\"bar\""
转义给定项中的 HTML 实体,返回安全的 iodata。
iex> html_escape("<hello>")
{:safe, [[[] | "<"], "hello" | ">"]}
iex> html_escape('<hello>')
{:safe, ["<", 104, 101, 108, 108, 111, ">"]}
iex> html_escape(1)
{:safe, "1"}
iex> html_escape({:safe, "<hello>"})
{:safe, "<hello>"}
转义要插入 JavaScript 字符串的 HTML 内容。
此函数在 JavaScript 响应中很有用,当需要转义来自其他模板(如以下)的 HTML 呈现时
$("#container").append("<%= javascript_escape(render("post.html", post: @post)) %>");
它转义引号(双引号和单引号)、双反斜杠等。
将给定内容标记为原始内容。
这意味着给定字符串中的任何 HTML 代码都不会被转义。
iex> raw("<hello>")
{:safe, "<hello>"}
iex> raw({:safe, "<hello>"})
{:safe, "<hello>"}
iex> raw(nil)
{:safe, ""}
将安全结果转换为字符串。
如果结果不安全,则会失败。在这种情况下,您可以在之前相应地调用 html_escape/1
或 raw/1
。
您可以结合 html_escape/1
和 safe_to_string/1
将数据结构转换为转义字符串
data |> html_escape() |> safe_to_string()