공백이있는 jquery ID


127

누구든지 ID가 공백이있을 때 jQuery를 사용하여 ID별로 DOM에서 항목을 선택하는 방법을 알고 있습니까?

예를 들어 내 상품의 ID는

<div id="content Module">Stuff</div>

jQuery로 어떻게 선택합니까?

내가 방금하면

$("#content Module").whatever() 

jQuery는 콘텐츠 ID와 모듈 ID를 모두 가진 항목을 찾으려고 시도합니다.

이 두 단어 ID가 광범위하게 사용되는 오래된 코드베이스로 작업 중이므로 모든 ID를 거치고 변경하는 것은 좋지 않습니다.


@ Glavić 모든 진술은 사실입니다. 그러나 새로 승인 된 답변은이 솔루션이 실제로 필요한 사람들에게 더 도움이 될 것입니다. 정말로 붙어있는 사람들에게는 공간을 다루는 방법을 아는 것이 정말로 필요합니다.
— Jeff Davis

네, 사실입니다,하지만 내 대답은 또한 ID의 공백에 대한 솔루션을, 그것도 밖으로 굵게)
— Glavić

1
ID 대신 ID를 올바르게 작성하도록 공감하십시오. 미안, 애완 동물 친구 그리고 네, 저는 대부분의 사람들이 약어 및 단축 단어를 복수형에 아포스트로피를 사용할 알고 있지만, 나에게 그것은 여전히 식료품의 아포스트로피처럼 보이는 walkinthewords.blogspot.com/2009/05/grocers-apostrophe.html
— 후안 멘데스

답변:


253

속성 선택기를 사용하십시오.

$("[id='content Module']").whatever();

또는 태그를 지정하는 것이 좋습니다.

$("div[id='content Module']").whatever();

$ ( '# id')와 달리 페이지 내에 동일한 ID를 가진 여러 요소가있는 경우 여러 요소를 반환합니다.


1
Glavic의 답변조차도 최고의 제안입니다. 이 답변이 문제를 해결했다고 생각합니다 :)
— GusDeCooL

8
이것은 많은 도움이되었습니다. 나는 ajax를 통해 끔찍한 HTML을 읽고 있으며 HTML의 구조 또는 ID 형식을 제어 할 수 없습니다. ID에는 공백이 있으므로 Elliot의 답변은 엄청나게 도움이되지만 glavic의 도움은 전혀 도움이되지 않습니다.
— daybreaker

고마워, 좋은 대답!
— alcfeoh

62

공백을 사용하지 마십시오. 이유는 간단합니다. 공백 문자는 ID 속성에 유효하지 않습니다.

ID 토큰은 문자 ([A-Za-z])로 시작해야하며 뒤에 여러 문자, 숫자 ([0-9]), 하이픈 ( "-"), 밑줄 ( "_"), 콜론이 올 수 있습니다. ( ":") 및 마침표 ( ".")

그러나 표준에 관심이 없다면 $("[id='content Module']")

비슷한 스레드> HTML의 id 속성에 유효한 값은 무엇입니까?

편집 : HTML 4.01과 HTML5의 ID가 어떻게 다른지

HTML5는 id 속성에 대한 추가 제한을 제거합니다. 문서에서 고유 한 것을 제외하고 남아있는 유일한 요구 사항은 값에 하나 이상의 문자 (비어있을 수 없음)를 포함해야하며 공백 문자를 포함 할 수 없다는 것입니다.

링크 : http://mathiasbynens.be/notes/html5-id-class


4
+1. 명명 표준을 준수하면이를 따르지 않을 때 해결 방법을 따를 필요가 없습니다.
— matt b

이것은 유효한 ID를 갖도록 두 번째 단어를 잘라내는 아이디어를 촉발했습니다. 문제를 해결했습니다. 감사합니다!
— Jeff Davis

1
여기에 HTML 4.01 사양을 인용하고 있습니다. 그것은 여전히 ID 속성 값을 사용 공간 문자를 허용하지 않는다 있지만, HTML5는 이러한 제한의 대부분을 제거 않습니다 mathiasbynens.be/notes/html5-id-class
— 마티아스 Bynens

2
"표준"으로 인해 기존 프로젝트의 전체 코드베이스를 해킹하라고 해킹하지 마십시오. 대부분, 이것은 주석, 확실히 허용 대답 :( 속도한다
— Coderer

이상한. 공간은 대부분의 목적에 적합합니다. 왜 표준이 아닌가?
— Lodewijk

23

누군가 궁금한 점이 있다면, 탈출하는 것이 효과가 있다는 것을 알았습니다. 이는 대상 DOM을 제어 할 수없는 경우 (예 : 사용자 스크립트 내에서) 특히 유용합니다.

$("#this\\ has\\ spaces");

이중 백 슬래시가 필요합니다.


JavaScript 자체가 다른 언어의 문자열 상수 인 경우 최대 4 개의 백 슬래시.
— Brilliand

2
다른 언어 자체가 다른 언어의 문자열 상수 인 경우 최대 8 개의 백 슬래시 :)
— daniel1426

1
문자열이 재귀 적으로 이스케이프 될 때 스택 오버플로가 발생합니다
— Jeff Davis

7

Chris가 제안한 방법은 jQuery 함수와 함께 작동하도록 조정될 수 있습니다.

var element = document.getElementById('content Module');
$(element) ... ;

1
아아! 더 아래로 스크롤해야합니다!
— gotomanners

2

시도 할 아이디어 :

$("#content" + &amp;#032; + "Module").whatever()

$("#content" + %20 + "Module").whatever()

세미콜론으로 인해 자바 스크립트 오류가 발생할 수 있습니다. 공백이 없도록 ID를 변경하는 것이 좋습니다.

또한 시도하십시오 document.getElementByID("content Module")


1
document.getElementByID는 일반 객체를 제공하므로 찾고있는 jQuery 함수를 수행 할 수 없습니다. 그러나 비슷한 상황에서는 좋은 해결 방법이 될 것입니다.
— Jeff Davis

1
$(document.getElementByID("content Module"))jquery 객체를 제공 하지 않습니까?
— gotomanners

1

이것은 나를 위해 일했습니다.

document.getElementById(escape('content Module'));

0

HTML에서 ID 속성 값에 공백이있는 것은 기술적으로 유효하지 않지만 실제로 jQuery를 사용하여 선택할 수 있습니다.

http://mothereffingcssescapes.com/#content%20module 참조 하십시오 :

<script>
  // document.getElementById or similar
  document.getElementById('content module');
  // document.querySelector or similar
  $('#content\\ module');
</script>

jQuery는 Selectors API와 유사한 구문을 사용하므로을 사용 $('#content\\ module');하여 요소를 선택할 수 있습니다 id="content module".

CSS에서 요소를 대상으로하려면 다음과 같이 이스케이프 할 수 있습니다.

<style>
  #content\ module {
    background: hotpink;
  }
</style>

0

요소가 id에 대한 정확한 값을 가지길 원한다면 작동 할 수 있습니다

$("[id='content Module']").whatever();

그러나 요소에 다른 ID가 있거나없는 class 중 하나만 가지고 있는지 확인하려면

$("[id~='content']").whatever();

이 경우이 요소를 선택합니다 id="content"하거나 id="content Module"또는id="content Module other_ids"


0

필자의 경우 공백이 % 20으로 바뀌기 때문에 이스케이프가 작동하지 않는다는 것을 알았습니다. 대신 페이지의 h1을 목록 항목의 텍스트로 바꾸는 대신 replace를 사용했습니다. 메뉴에 다음이 포함 된 경우 :

<li id="Contact Us"\>Contact Us</li>

function setTitle(menu) {
    $("h1").text( $("li#" + menu.replace(" ", "\\ ")).text() );
}

0

jQuery에 쉼표 및 / 또는 공백이 포함 된 요소 ID에 문제가 있었 으므로이 작업을 수행했으며 매력처럼 작동했습니다.

var ele = $(document.getElementById('last, first'));

공백이 있고 작동하지 않습니다.

var ele = $('#last, first');

쉼표가 있으며 작동하지 않습니다.

var ele = $('#last,first');


0

선택기에서 기타 문자를 이스케이프 처리합니다 (공백 포함) .

var escapeSelector = function(string) {
  string = string||"";
  if (typeof string !== 'string') return false;
    return string.replace( /(:|\.|\[|\]|,|=|@|\s|\(|\))/g, "\\$1" );

}
console.log($("div[data-id="+escapeSelector("Document (0).json")+"]").text());   
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div data-id="Document (0).json">Howdy</div>

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.