为什么我需要在CSS选择器中使用@的属性值周围的引号?

时间:2014-04-29 12:52:34

标签: javascript jquery html dom

我使用以下内容访问具有占位符的特定 DOM元素 "Serial"

$('input[placeholder=Serial]')

正常工作。当我尝试使用以下内容访问它们时,我有一些其他DOM元素占位符为"@SAL"

$('input[placeholder=@SAL]')

引发此错误

  

错误:语法错误,无法识别的表达式:input [placeholder = @ SAL]

但是,当我尝试使用双引号 "@SAL周围访问时,正常

现在问题是,为什么$('input[name=Serial]')正常工作,即没有围绕占位符值的双引号,但$('input[placeholder=@SAL]')会抛出上述错误?

PS 我知道根据占位符访问DOM元素是个坏主意(因为它们可能会发生变化),但我只是好奇为什么是它不适用于这种特殊情况......

3 个答案:

答案 0 :(得分:9)

它就在文档中 -

  

选择器表达式中的属性值必须遵循W3C CSS选择器的规则;通常,这意味着除了有效标识符之外的任何内容都应该用引号括起来。

http://api.jquery.com/category/selectors/attribute-selectors/

  

在CSS中,标识符(包括选择器中的元素名称,类和ID)只能包含字符[a-zA-Z0-9]和ISO 10646字符U + 00A0及更高,加上连字符( - )和下划线(_);它们不能以数字,两个连字符或连字符后跟数字开头。标识符还可以包含转义字符和任何ISO 10646字符作为数字代码(请参阅下一项)。例如,标识符" B& W?"可以写成" B \& W \?"或" B \ 26 W \ 3F"。

请注意,Unicode是代码相当于ISO 10646的代码(参见[UNICODE]和[ISO10646])。

http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier

以' @'开头的选择器不是有效的选择器,但可以通过使用引号或转义相关字符来补救。

答案 1 :(得分:1)

因为@是一个特殊字符,所以需要像这样转义:

$('input[placeholder=\\@SAL]')

(实际的选择器有一个反斜杠,但由于这是一个JavaScript字符串文字,我们必须使用\\在选择器中获得一个反斜杠。)

或者使用带有这样的引号的字符串值选择它:

$('input[placeholder="@SAL"]') // this does not need to escaped.

答案 2 :(得分:0)

你的两种情况之间的唯一区别是@符号,因此你应该逃避它,或者我会引用它来使它成为一个字符串。它绝对应该以这种方式工作。