2012-02-08 54 views
12

我无法理解在html标记属性值内部如何转义工作。 。在html标记属性值内部转义

我带领相信你应该总是逃脱&“”<>因此,对于JavaScript作为一个属性值我想:

<a href="javascript:alert(&apos;Hello&apos;);"></a> 

它不工作,但是:

<a href="javascript:alert(&#39;Hello&#39;);"></a> 

<a href="javascript:alert('Hello');"></a> 

确实在所有浏览器的工作!

现在我完全糊涂了。如果我的所有属性值都用双引号引起来,这是否意味着我不必转义单引号?或者是和技术上不同的字符?这样的JavaScript需要ascii 39,但不是?

+0

好吧,我刚刚发现'实际上并不是HTML中的参考实体,尽管w3schools说了什么(http://www.w3.org/TR/1998/REC-html40-19980424/sgml/entities.html ) – Myforwik 2012-02-08 04:51:40

+0

我认为'''自[HTML 5.0](https://www.w3.org/TR/html50/syntax.html#named-character-references)开始就有明确定义。 – 2018-01-26 15:50:47

回答

26

这里涉及到两种类型的“转义”,HTML和JavaScript。在解释HTML文档时,首先会解析HTML转义。

至于HTML被认为是,属性值中的规则是一样的其他地方加一个附加规则:

  • 小于号字符<应该逃脱。通常&lt;用于此。从技术上讲,取决于HTML版本,转义并不总是必需的,但它一直是很好的做法。
  • &符号&应该被转义。通常使用&amp;。这也不总是强制性的,但总是这样做要比学习和记忆何时需要更简单。
  • 用作属性值周围的分隔符的字符必须在其内部转义。如果使用Ascii引号"作为分隔符,则通常使用&quot;来避免其出现,而对于Ascii撇号,实体引用&apos;仅在某些HTML版本中定义,因此使用数字引用&#39;(或&#x27;)。

如果你愿意,你可以跳过>(或任何其他数据字符),但它是永远不需要的。

在JavaScript方面,字符串文字中有一些转义机制(使用\)。但这些是不同的问题,与您的情况无关。

在您的示例中,在符合当前规范的浏览器上,JavaScript解释器会看到完全相同的代码alert('Hello');。浏览器具有“未转义”&apos;&#39;'。我在这里有点惊讶,&apos;这些天没有得到普遍支持,但它不是一个问题:很少有任何需要在HTML中转义Ascii撇号(只有在属性值中需要转义时才需要转义),只有当您使用Ascii撇号作为其分隔符),如果有,可以使用&#39;参考。

+0

出于好奇,请您详细说明何时有必要避开&符号,何时不符合? – 2013-01-18 06:31:27

+1

@RakeshPai,这取决于HTML版本。按照HTML 4.01规则,如果紧跟着一个Ascii字母(a-z,A-Z),或者紧跟着数字符号“#”和一个Ascii字母,则必须转义符号。 – 2013-01-18 08:32:26

+0

有趣。这是有道理的,因为它会与其他类型的HTML实体冲突。谢谢。 – 2013-01-18 09:24:23

-2

如果您的标记用双引号括起来,那么您就不必越过单引号就可以了。当我将JavaScript编码到标签中时(这种情况在jQuery中很少见),我唯一能够逃避的字符是双引号,浏览器处理其余部分就好了。