【问题标题】:When exactly do strings in HTML require escaping?HTML 中的字符串何时需要转义?
【发布时间】:2012-07-14 07:30:23
【问题描述】:

在 HTML 的几乎每个标签中,<(开始标签)和&(字符转义)等字符都必须进行转义。

但是,在<script> 标签内,这似乎并不适用!我可以在 HTML 中明确定义字符,也可以使用 jQuery 检索它们,例如 var my_unescaped_text = $('script[type="text/mytexttype"]');

还有其他标签可以做到这一点吗?有没有什么方法可以让这种事情在<pre>标签中变得可见而不使用javascript? (是的,我知道,这听起来绝对是一项艰巨的任务......)

<input><textarea> 标签呢?绝对可以将这些字符写在文本输入字段中,并且 可见且可样式化(这满足了我可能不清楚的目标)。还有别的事吗?我要显示的文本(前 javascript 处理)是 Markdown,<pre> 可能最适合它,尽管 <textarea readonly="readOnly"> 可能看起来与 <pre> 完全一样。

【问题讨论】:

  • <script> 标签是一种特殊情况,请将您的脚本保留在 HTML 之外,否则您应该不会有太多问题。

标签: javascript jquery html dom tags


【解决方案1】:

将任意文本嵌入 HTML 时必须始终转义。

然而,special rules 申请<script> 标签的内容,它们允许未转义的< 在某些条件下,即它不是</script> 的一部分.因此,"<" 在 JavaScript 中的正确编码是"\u003c"

对于security reasons,您一开始就不应该使用内联JavaScript。请改用data- attributes

【讨论】:

  • 说“但是”比“因此”更有意义吗?因为这似乎表明在 <script> 标记内写入“
  • 否;只有在 HTML 元素中的 JavaScript 字符串中写入 < 才合法,前提是您可以保证它后面没有 /script(同样,您可能需要避免使用 -->。在任何情况下在这种情况下,不推荐使用内联 JavaScript;请参阅更新答案的最后一段。
  • 好的,我会做对的,然后使用<pre> 并用转义文本填充它。
  • 如果您想向用户显示文本,是的,这是最好的选择。不过,您不需要 <pre> - 几乎每个(语义上适用的)元素都可以。
  • 是的,现在唯一的事情是我必须在将文本发送到 Markdown 处理之前取消转义文本。
【解决方案2】:

转义规则取决于 HTML 版本:XHTML 有自己的规则。决定您将使用哪个版本的 HTML,并从优秀的教程和参考资料中学习其规则。

关于详细问题:

  1. 本期中与script类似的另一个元素是style。还有一个非标准但得到良好支持的 xmp 元素,可用于将 HTML 标记原样呈现为内容。
  2. 不,您不能更改规则,以便例外(适用时)适用于 pre
  3. inputtextarea 元素在这方面并不特殊。你可能被<input value="a<b"> 之类的测试误导了,它是有效的(XHTML 除外),因为< 不需要在属性值中转义。或者通过像 <input value="&"> 这样的测试,这是允许的(XHTML 除外),因为 & 后面没有名称字符。

要显示标记(包括 Markdown),推荐的方法是像往常一样在内容中转义每次出现的 <&。您可以出于其他原因(例如格式或逻辑)使用 code 标记和/或 pre 标记,但它们不会影响 HTML 解析或需要转义。如前所述,还有xmp,类似于pre,但元素内的任何标记都不会被识别,将所有内容视为文本,除了结束标记</xmp>;但同事、老板或老师可能会因为你使用它而责骂你。

【讨论】:

  • 我不明白这个问题。要么转义 <& 以使其按原样显示,要么希望它们成为浏览器解释的标记的一部分。并且当您的文档的 HTML 源内容中包含 < 时,DOM 会将其包含为 <,因此在发送数据进行处理时,您不需要也不应该对任何内容进行转义。 (前提是你没有使用innerHTML。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2014-03-20
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多