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

Jeps, 내 페이지는 asp.net mvc 프레임 워크가 생성하는 이중 <title> 태그를 제외하고 모두 유효합니다.
Boris Callens

답변:


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 : 예, 클레 투스는 같은 예를 생각해 냈습니다. 아직도 그것은 나에게 이상하게 느껴지며, 그렇게 할 수 있다는 진정한 이점을 볼 수 없습니다. 특히 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 선택자를 식별하는 데 사용되는 정규식 (퀵 엑스 프)은 점을 유효한 문자로 포함하지 않습니다. 그러나 HTML 사양에서는 허용됩니다.
Tomalak

5
ID에 클래스 선택기가 있으면 유용 할 수 있습니다. 모든 페이지에 #menu 요소가 있지만 페이지 중 하나에서 다르게 만들고 싶다고 상상해보십시오. 예를 들어 # menu.hideme? 한계는 알고 있지만 유효합니다.
cletus

2
이것은 분명히 최고의 답변입니다. 다음과 같은 변수로도 작동합니다 : $ ( "tr [id = '"+ private_var + "']"). css ( "background-color", "#EEEEEE");
Steve 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
이 질문이 3 세 이상되었고 문서가 당시와 다를 수 있다는 것을 알고 있습니까?
Reimius

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']");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.