Javascript CSS类选择器中的转义字符
我试图在CSS类选择器中实现字符转义的描述 我遇到了Javascript CSS类选择器中的转义字符,javascript,html,css-selectors,Javascript,Html,Css Selectors,我试图在CSS类选择器中实现字符转义的描述 我遇到了abc\20 def语法的问题,该语法在转义序列后放置空格,以确保def不会被误读为字符代码的一部分 具体地说,尝试将abc\XY def放入HTML类属性或类似于jQuery().addClass('abc\\20 def')(这里的\是JS字符串文字语法的一部分;字符串值本身有一个斜杠)的命令都将为元素提供两个类,abc\20和def 这个语法是不是实现得很糟糕,我应该坚持使用六位数的前导零形式?或者该文档是否只引用CSS代码中的转义格式,
abc\20 def
语法的问题,该语法在转义序列后放置空格,以确保def
不会被误读为字符代码的一部分
具体地说,尝试将abc\XY def
放入HTML类属性或类似于jQuery().addClass('abc\\20 def')
(这里的\
是JS字符串文字语法的一部分;字符串值本身有一个斜杠)的命令都将为元素提供两个类,abc\20
和def
这个语法是不是实现得很糟糕,我应该坚持使用六位数的前导零形式?或者该文档是否只引用CSS代码中的转义格式,而HTML属性/jQuery参数需要某种不同形式的转义空格字符
编辑:非常感谢大家的解释
我现在明白了,这种语法只适用于CSS代码,而不是HTML属性或Javascript中设置的类名本身
这也意味着指定为空白的字符不能出现在CSS类值中,并且没有任何转义机制允许添加它们。(具体地说,如果我理解正确,CSS选择器.abc\20 def
是有效的,并选择具有类abc def
的元素,但没有意义,因为没有元素可以具有此类。)
对于我的具体用例,它涉及到将任意值(可以有空格)映射到有效的类名,我需要定义我自己的转义方案。将空格替换为-
或-
(感谢Praveen)是一种可能性;如果需要一对一的映射,则使用六位Unicode十六进制值替换它们(例如,“abc def”->“abc\000020def”
是一种更健壮的映射
需要记住的重要一点是,此替换会影响类名本身——要在CSS中引用类
abc\000020def
,必须再次转义反斜杠,以形成选择器。abc\\000020def
简短回答:DOM解析作为字符串传递给它的任何选择器。如果如果结果包含空格或非打断空格,则它们将计为类分隔符
您不应该担心jQuery或任何其他ECMAScript将用于结束转义块的空格误解为类分隔符 简单地说,因为他们不负责这个匹配。文档对象模型是。解释转义CSS类的同一个DOM。因此,如果转义类名在样式表中起作用,它将在任何JavaScript库传递时起选择器的作用 有一个条件:它以它能理解的形式传递给DOM。一个在CSS中工作的形式
现在,假设由于语义原因,您希望在元素上使用类<代码> 100% /代码>。您至少需要逃出选择器的第一个和最后一个字符。中间的可能或不可能逃脱。可能的选择器,在DOM级别上转换为<代码> 100% < /代码>类名,将是:
\31 00\25
\31 0\30\25
\31\30 0\25
\31\30\30\25
\31\30\30\25
\\31 00\\25
\\31 0\\30\\25
\\31\\30 0\\25
\\31\\30\\30\\25
\\31\\30\\30\\25
0%
的元素,您将看到它们没有被选中。因为DOM解析器会将上述任何选择器转换为100%
,并将它们与您放入元素的100%
类相匹配
$('.\\31\\30\\30\\25>div')。在('click',function()上{
var位置=[‘第一’、‘第二’、‘第三’];
警报('您单击了'+位置[$(this.index()]+'div.');
})
\31 0\30\25>div{
填充:20px;
}
.\31 00\25>*:第一个孩子{
颜色:红色;
}
.\31\30 0\25>*:第n个子项(2){
颜色:蓝色;
}
.\31\30\30\25>*:最后一个孩子{
颜色:绿色;
}
第一
第二
第三
您正在混淆DOM中的类名和CSS中所需的转义版本。类名只是按原样指定的:
elt.classList.add('foo:bar')
在CSS文件(或其他CSS选择器上下文,如querySelector
)中引用此项时,必须对其进行转义:
.foo\:bar { color: red; }
这同样适用于选择使用数字转义的情况:
elt.classList.add('1234');
.\31 234 { color: red; }
但是,任何转义都不允许在类名中使用空格。空格绝对是为在DOM
className
属性上分隔多个类名而保留的。我认为您可以使用class=“abc&;x0020;def”
要解决这个问题事实上,这是一个复杂的邪恶的混乱局面,如果我问你为什么需要(或想要!)这样做,请记住?这种语法是邪恶的。试着使用-
或-
。你可以说“适当的方法是使用破折号”。但是你不应该创建一个粗鲁的评论并给出负号,因为你没有