当id包含点时,如何通过jquery的ID选择html节点?


178

如果我的html看起来像这样:

<td class="controlCell">
    <input class="inputText" id="SearchBag.CompanyName" name="SearchBag.CompanyName" type="text" value="" />
</td>

如何使用JQuery选择#SearchBag.CompanyName?我无法使其正常工作,我担心这是打破一切的圆点。令人烦恼的是,重命名我的所有ID会花费很多工作,更不用说可读性的损失了。

注意:
请不要开始谈论如何不为布局创建表格。我非常了解CSS价值和缺点,并尝试尽可能多地使用它。


1
ID中的句点甚至是有效的HTML吗?
cletus

7
是。ID可能包含“-”,“ _”,“。” 和':'。w3.org/TR/html4/types.html#type-name
bobince,2009年

Jeps,除了双<title>标签我的网页的所有验证asp.net mvc框架生成..
鲍里斯Callens

Answers:


215

@Tomalak在评论中:

由于ID选择器必须以#号开头,因此此处不应含糊

“#id.class”是一个有效的选择器,需要一个ID和一个单独的类来匹配;这是有效的,但并不总是完全多余的。

选择文字“。”的正确方法 在CSS中是要转义它:“#id \ .moreid”。这曾经在某些较旧的浏览器(尤其是IE5.x)中引起麻烦,但是所有现代桌面浏览器都支持它。

jQuery 1.3.2似乎可以使用相同的方法,尽管我尚未对其进行全面测试。quickExpr不会选择它,但是涉及更多的选择器解析器似乎可以正确地实现它:

$('#SearchBag\\.CompanyName');

1
“#id.class是一个有效的选择器,需要一个ID和一个单独的类来匹配”:根据HTML规范,ID在整个文档中必须是唯一的。“#id.class”有什么用处?我的意思是,您不能比“ #id”更具体,可以吗?
Tomalak

2
@Tom:“#id.class”对于使用相同样式表的多个文档或使用客户端脚本设置状态可能是好的。例如“#navhome.navselected”。
bobince

@bobince:是的,cletus提出了相同的示例,我怀疑它是有效的。仍然令我感到奇怪,而且我看不到能够做到这一点的真正优势。特别是考虑到HTML中允许在ID中加点,并且您始终可以使用“ .navselected”来实现这一点。
Tomalak

例如,您可能希望选定的#navhome以与选定的#navabout不同的颜色点亮,但其他.navselected属性要共享。我不会一直说这种情况,但是我确实偶尔需要它。
bobince

3
我认为@Tomalak的答案更为优雅,例如:$('[id="profile.birthdate"]')
dr.dimitru

118

一种变体是这样的:

$("input[id='SearchBag.CompanyName']")

1
确实。您能否告诉我为什么您的解决方案有效,而$(“#SearchBag.CompanyName”)无效?
Boris Callens

9
因为.CompanyName被视为类选择器。
cletus

2
快速查看源代码,这是一个故意的设计决策或一个错误。用于标识ID选择器的正则表达式(名为quickExpr)不包含点作为有效字符。HTML规范但是允许它。
Tomalak

5
在ID上使用类选择器可能很有用。假设您在每个页面上都有一个#menu元素,但希望在其中一个页面上使其与众不同。例如#menu.hideme?我知道是有限的,但这是有效的。
cletus

2
这显然是上乘的答案。也可以使用以下变量:$(“ tr [id ='” + private_var +“']”)。css(“ background-color”,“ #EEEEEE”);
史蒂夫·K

33

如果使用,则无需逃脱任何操作document.getElementById

$(document.getElementById('strange.id[]'))

getElementById 假设输入只是一个id属性,因此该点将不会被解释为类选择器。


整洁的解决方案也可以很好地与可能包含点的动态ID配合使用
-Cookalino

17

简短答案:如果您有一个id =的元素"foo.bar",则可以使用选择器$("#foo\\.bar")

更长的答案:这是jquery文档的一部分-部分选择器,您可以在这里找到:http : //api.jquery.com/category/selectors/

在文档开始处即可回答您的问题:

如果您希望使用任何元字符(例如 
!“ ##%&'()* +,。/:;?@ [\] ^`{|}〜) 
作为名称的文字部分,您必须使用 
两个反斜杠:\\。例如,如果您的元素具有id =“ foo.bar”,
您可以使用选择器$(“#foo \\。bar”)。W3C CSS规范包含
有关有效CSS选择器的完整规则集。同样有用的是
Mathias Bynens撰写的博客条目,介绍了标识符的CSS字符转义序列。

4
您确实意识到这个问题已经存在三年多了,那时的文档可能不一样,对吧?
Reimius 2012年

9

当您的ID位于变量中时,选择attr似乎是合适的:

var id_you_want='foo.bar';
$('[id="' + id_you_want + '"]');

4

jQuery选择器API中对此进行了说明:

要将任何元字符(例如 !"#$%&'()*+,./:;<=>?@[\]^`{|}~)用作名称的文字部分,必须使用两个反斜杠对它进行转义:\\。例如,带有的元素 id="foo.bar"可以使用选择器$("#foo\\.bar")

简而言之,在前面.加上\\

$('#SearchBag\\.CompanyName')

问题是.将匹配一个类,所以$('#SearchBag.CompanyName')将匹配<div id="SearchBag" class="CompanyName">。转义\\.为的普通字符将被视为.没有特殊意义的普通字符,与您所需的ID相匹配。

这适用于所有!"#$%&'()*+,./:;<=>?@[\]^`{|}~在jQuery中作为选择器具有特殊意义的字符。


2

那些正在寻找更通用解决方案的人,我发现了一个解决方案,该解决方案在任何特殊字符之前插入一个反斜杠,从而解决了与从包含特殊字符的div检索名称和ID相关的问题。

“ Str1.str2%str3” .replace(/ [^ \ w \ s] / gi,'\\ $&')

返回“ Str1 \\。str2 \\%str3”

希望这是有用的!


1

您可以使用属性选择器:

$("[id='SearchBag.CompanyName']");

或者,您可以指定元素类型:

$("input[id='SearchBag.CompanyName']");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.