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.