jQuery를 사용하여 요소를 선택하려면 어떻게해야합니까? (기간) 아이디?


172

다음과 같은 클래스 및 컨트롤러 작업 방법이 제공됩니다.

public School
{
  public Int32 ID { get; set; }
  publig String Name { get; set; }
  public Address Address { get; set; }
}

public class Address
{
  public string Street1 { get; set; }
  public string City { get; set; }
  public String ZipCode { get; set; }
  public String State { get; set; }
  public String Country { get; set; }
}

[Authorize(Roles = "SchoolEditor")]
[AcceptVerbs(HttpVerbs.Post)]
public SchoolResponse Edit(Int32 id, FormCollection form)
{
  School school = GetSchoolFromRepository(id);

  UpdateModel(school, form);

  return new SchoolResponse() { School = school };
}

그리고 다음과 같은 형태 :

<form method="post">
  School: <%= Html.TextBox("Name") %><br />
  Street: <%= Html.TextBox("Address.Street") %><br />
  City:  <%= Html.TextBox("Address.City") %><br />
  Zip Code: <%= Html.TextBox("Address.ZipCode") %><br />
  Sate: <select id="Address.State"></select><br />
  Country: <select id="Address.Country"></select><br />
</form>

School 인스턴스와 학교의 Address 멤버를 모두 업데이트 할 수 있습니다. 이것은 꽤 좋다! ASP.NET MVC 팀 감사합니다!

그러나 jQuery를 사용하여 드롭 다운 목록을 선택하여 미리 채울 수 있습니까? 이 서버 측을 수행 할 수는 있지만 페이지에 목록에 영향을 미치는 다른 동적 요소가 있음을 알고 있습니다.

다음은 내가 지금까지 얻은 내용이며 선택기가 ID와 일치하지 않으므로 작동하지 않습니다.

$(function() {
  $.getJSON("/Location/GetCountryList", null, function(data) {
    $("#Address.Country").fillSelect(data);
  });
  $("#Address.Country").change(function() {
    $.getJSON("/Location/GetRegionsForCountry", { country: $(this).val() }, function(data) {
      $("#Address.State").fillSelect(data);
    });
  });
});

답변:


293

에서 Google 그룹스 :

각 특수 문자 앞에 두 개의 백 슬래시를 사용하십시오.

jQuery 선택기의 백 슬래시는 다음 문자를 이스케이프합니다. 그러나 백 슬래시는 JavaScript 문자열의 이스케이프 문자이기 때문에 두 개가 필요합니다. 첫 번째 백 슬래시는 두 번째 백 슬래시를 이스케이프하여 문자열에 실제 백 슬래시를 제공합니다. 그런 다음 jQuery의 다음 문자를 이스케이프합니다.

네가보고있는 것 같아

$(function() {
  $.getJSON("/Location/GetCountryList", null, function(data) {
    $("#Address\\.Country").fillSelect(data);
  });
  $("#Address\\.Country").change(function() {
    $.getJSON("/Location/GetRegionsForCountry", { country: $(this).val() }, function(data) {
      $("#Address\\.State").fillSelect(data);
    });
  });
});

또한 체크 아웃 내가 CSS 표기법에 사용 된 문자가있는 ID로 요소를 선택하려면 어떻게합니까? jQuery FAQ에서.


4
개발자가 이것을 요구하는 합리화가 무엇인지 궁금합니다. jQuery 내의 간단한 휴리스틱이이 문제를 해결하는 것처럼 보입니다. ID가 마침표로 잘못되어 있지 않기 때문입니다.
Jason Bunting

5
이스케이프 할 필요가 없다면 ID 주소와 클래스 상태를 가진 요소를 어떻게 쿼리합니까 (ID를 알고 있다면 클래스를 지정하여 많이 추가하지는 않지만 여전히 유효해야 함을 인정합니다) 생각한다)?
bdukes

12
따라서 CSS 자체에서 ID의 점도 이스케이프해야합니다. 모든 jQuery가 수행하는 작업은 CSS에서 설정 한 규칙을 따라야합니다.
bdukes 2009

6
ID 대신 이름으로 선택할 수도 있습니다. 예를 들어 $ ( '[name = "Address.Country"]')
Funka

25

id에 공백이 있으면 jQuery id 선택기를 사용할 수 없습니다. 속성 선택기를 사용하십시오.

$('[id=foo bar]').show();

가능하면 요소 유형도 지정하십시오.

$('div[id=foo bar]').show();

이스케이프 문자를 사용하는 것보다이 방법을 선호합니다 .... 가장 좋은 해결 방법은 id에 마침표를 사용하지 않는 것입니다.
GordonB

ID에는 공백이 허용되지 않으며 HTML5가 더 자유롭게 문자를 허용하더라도 공백은 허용되지 않습니다. stackoverflow.com/questions/70579/…
Jay Blanchard

그러나 허용 여부에 관계없이 90 년대 후반에 배포 된 잘못 작성된 웹 앱에 창 드레싱을 추가하는 데 어려움을 겪는 가난한 수액은 중요하지 않습니다.
엘리엇 넬슨

4
`$ ( "div [id = '"+ variable + "']")`또는`$ ( "div [id = 'foo bar']")`
olga

@olga가 말했듯이 대답은 더 이상 합법적이지 않습니다. 구체적으로, "발견되지 않은 오류 : 구문 오류, 인식 할 수없는 표현식 : div [id = foo bar]"라는 오류 메시지가 표시됩니다.
James Moore

13

Jquery를 위해 탈출하십시오.

function escapeSelector(s){
    return s.replace( /(:|\.|\[|\])/g, "\\$1" );
}

사용 예 :

e.find('option[value='+escapeSelector(val)+']')

더 많은 정보는 여기에 .


2
jQuery 문서에 따른 솔루션은 하나의 "\"(슬래시) 만 추가하는 것입니다. alert (escapeSelector ( "some.id")); some \ .id로 출력됩니다. 따라서 대체 정규식은 s.replace (/(:|\.|[|])/g, "\\\\ $ 1")이어야합니다.
Arun

나는 같은 문제가 있는데 왜 다른 사람이 이것을 보지 않습니까?
TruthOf42

9

방금 릴리스 된 ASP.NET MVC의 릴리스 후보는이 문제를 해결하여 이제 점을 ID 속성의 밑줄로 바꿉니다.

<%= Html.TextBox("Person.FirstName") %>

렌더링

<input type="text" name="Person.FirstName" id="Person_FirstName" />

자세한 내용은 14 페이지부터 릴리스 정보를 참조하십시오.


1
이것이 어떻게 "수정"인지 알 수 없습니다. 왜 ASP.NET MVC가 ID를 jQuery에 필요한 것으로 변경해야합니까? jQuery는을 사용하지 않고 문제가있는 곳이라고 생각합니다. ID로.
Jason Bunting

7
이 점은 CSS에서 클래스를 식별 / 결합하는 데 특별한 의미가 있으므로 ID에 포함시키는 것이 번거로운 이유입니다. "문제"는 jquery와 관련이 없습니다.
Funka

4

이것은 jQuery Selectors docs에 설명되어 있습니다 .

메타 문자 (예 !"#$%&'()*+,./:;<=>?@[\]^`{|}~:)를 이름의 리터럴 부분으로 사용하려면 두 개의 백 슬래시로 이스케이프해야합니다 \\. 예를 들어,가있는 요소 id="foo.bar"는 선택기를 사용할 수 있습니다 $("#foo\\.bar").

즉, 접두사 .와 함께 \\다음과 같이 :

$("#Address\\.Country")

.아이디가 작동 하지 않습니까?

문제는 .특별한 의미 가 있다는 것입니다. 다음 문자열은 클래스 선택기로 해석됩니다. 그래서 $('#Address.Country')일치합니다<div id="Address" class="Country"> .

로 이스케이프 \\.하면 점은 특별한 의미없이 일반 텍스트로 취급되며 원하는 ID와 일치합니다 <div id="Address.Country">.

이것은 !"#$%&'()*+,./:;<=>?@[\]^`{|}~그렇지 않으면 jQuery의 선택기로 특별한 의미를 갖는 모든 문자에 적용됩니다 . 그냥 \\일반 텍스트로 취급하기 만하면 됩니다.

왜 2 \\입니까?

bdukes 답변에서 언급했듯이 2 \문자 가 필요한 이유가 있습니다 . \JavaScript에서 다음 문자를 이스케이프합니다. 자바 스크립트 문자열을 해석 자체 때 "#Address\.Country", 그것은을 볼 수 \의미하는 것으로 해석 litterally 다음과 같은 특성을 가지고제거 문자열이에 인수로 전달 될 때를 $(). 즉, jQuery는 여전히 문자열을"#Address.Country" 합니다.

두 번째 \게임이 시작됩니다. 첫 번째는 두 번째 문자를 특수 문자가 아닌 문자로 해석하도록 JavaScript에 지시합니다. 이것은 두 번째 . 문자가 jQuery에 표시되고 다음 문자가 리터럴 문자 임을 이해한다는 의미 입니다.

휴! 어쩌면 우리는 그것을 시각화 할 수 있습니다.

//    Javascript, the following \ is not special.
//         | 
//         |
//         v    
$("#Address\\.Country");
//          ^ 
//          |
//          |
//      jQuery, the following . is not special.

2

두 개의 백 슬래시를 사용하면 괜찮습니다. 그러나 동적 이름을 사용하는 경우 변수 이름이므로 문자를 바꿔야합니다.

변수 이름을 변경하지 않으려면 다음을 수행하십시오.

var variable="namewith.andother";    
var jqueryObj = $(document.getElementById(variable));

jquery 객체보다.


0

추가 정보 만 :이 ASP.NET MVC 문제 # 2403을 확인하십시오 .

문제가 해결 될 때까지 Html.TextBoxFixed 등과 같은 내 자신의 확장 메서드를 사용하여 id 속성 (이름 속성이 아닌)의 점을 밑줄로 간단히 대체하므로 $ ( "# Address_Street")와 같은 jquery를 사용하십시오 그러나 서버에서는 Address.Street와 같습니다.

샘플 코드는 다음과 같습니다.

public static string TextBoxFixed(this HtmlHelper html, string name, string value)
{
    return html.TextBox(name, value, GetIdAttributeObject(name));
}

public static string TextBoxFixed(this HtmlHelper html, string name, string value, object htmlAttributes)
{
    return html.TextBox(name, value, GetIdAttributeObject(name, htmlAttributes));
}

private static IDictionary<string, object> GetIdAttributeObject(string name)
{
    Dictionary<string, object> list = new Dictionary<string, object>(1);
    list["id"] = name.Replace('.', '_');
    return list;
}

private static IDictionary<string, object> GetIdAttributeObject(string name, object baseObject)
{
    Dictionary<string, object> list = new Dictionary<string, object>();
    list.LoadFrom(baseObject);
    list["id"] = name.Replace('.', '_');
    return list;
}

1
위에서 언급 한 문제에서 : "UpdateModel ()은 점을 사용합니다. 그 이유는 양식 요소가 들어오는 방식이기 때문입니다. 양식 요소는 HTML 도우미 호출에 지정된 방식이기 때문에 점을 사용합니다. HTML 도우미 호출은 점을 사용합니다. ViewData.Eval ()이 작동합니다. 마지막으로, ViewData.Eval ()은 점을 사용합니다. 왜냐하면 주 .NET Framework 언어에서 객체와 그 속성을 분리하는 방식이기 때문입니다.이 체인의 임의의 지점에서 점 이외의 구분자를 사용하면 전체 체인의 흐름. "
Simon_Weaver

0

jquery docs에서 제공 한 솔루션으로 문제를 해결했습니다.

내 기능 :

//funcion to replace special chars in ID of  HTML tag

function jq(myid){


//return "#" + myid.replace( /(:|\.|\[|\]|,)/g, "\\$1" );
return myid.replace( /(:|\.|\[|\]|,)/g, "\\$1" );


}

참고 : 코드에서 ID를 다른 텍스트와 연결하기 때문에 "#"을 제거합니다.

글꼴 : Jquery Docs는 특수 문자가있는 요소를 선택합니다.

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