ฉันจะรับ jQuery เพื่อเลือกองค์ประกอบด้วย a ได้อย่างไร (จุด) ใน ID ของพวกเขา?


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>

ฉันสามารถอัปเดตทั้งอินสแตนซ์ของโรงเรียนและสมาชิกที่อยู่ของโรงเรียนได้ มันค่อนข้างดี! ขอบคุณทีม ASP.NET MVC!

อย่างไรก็ตามฉันจะใช้ 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);
    });
  });
});

คำตอบ:


293

จากGoogle Groups :

ใช้แบ็กสแลชสองตัวต่อหน้าอักขระพิเศษแต่ละตัว

แบ็กสแลชในตัวเลือก jQuery หนีอักขระต่อไป แต่คุณต้องการสองอย่างเพราะแบ็กสแลชเป็นอักขระ escape สำหรับสตริง 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);
    });
  });
});

ตรวจสอบด้วยฉันจะเลือกองค์ประกอบด้วย ID ที่มีอักขระที่ใช้ในสัญกรณ์ CSS ได้อย่างไร บน jQuery FAQ


4
ฉันสงสัยว่าหาเหตุผลเข้าข้างตนเองสำหรับการกำหนดให้นักพัฒนาที่จะทำเช่นนี้ก็ดูเหมือนว่าชุดที่เรียบง่ายของการวิเคราะห์พฤติกรรมภายใน jQuery จะแก้ปัญหานี้เนื่องจากมีไม่ผิดอะไรกับ ID ที่มีระยะเวลาในพวกเขา ...
เจสันตอม่อ

5
หากคุณไม่ต้องหลบหนีคุณจะค้นหาองค์ประกอบด้วยที่อยู่ ID และสถานะของชั้นเรียนอย่างไร (ระบุว่าถ้าคุณรู้ ID ที่คุณไม่ได้เพิ่มมากขึ้นโดยการระบุชั้นเรียน แต่ควรจะยังคงใช้ได้อยู่ฉันต้องการ คิด)?
bdukes

12
ด้วยเหตุผลดังกล่าวใน CSS เองคุณต้องหลีกเลี่ยงจุดใน ID เช่นกัน jQuery ทั้งหมดนั้นกำลังทำอยู่นั้นต้องการให้คุณทำตามกฎที่กำหนดโดย CSS
bdukes

6
คุณสามารถเลือกตามชื่อแทนที่จะเป็น ID ตัวอย่างเช่น $ ('[name = "Address.Country"]')
Funka

25

คุณไม่สามารถใช้ตัวเลือก jQuery id หาก id มีช่องว่าง ใช้ตัวเลือกแอททริบิวต์:

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

หากเป็นไปได้ให้ระบุประเภทองค์ประกอบด้วย:

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

ฉันชอบที่จะทำแบบนี้มากกว่าการใช้ตัวละคร Escape ... แน่นอนว่าวิธีแก้ปัญหาที่ดีที่สุดคือการไม่ใช้เครื่องหมายจุดใน id
GordonB

ไม่อนุญาตให้ใช้ช่องว่างใน id ไม่ใช่แม้แต่การยอมรับตัวอักษรที่มากกว่าของ HTML5 stackoverflow.com/questions/70579/…
Jay Blanchard

จริง แต่ไม่ว่าพวกเขาจะได้รับอนุญาตหรือไม่ไม่สำคัญต่อ SAP ที่ยากจนซึ่งติดกับการเพิ่มหน้าต่างแต่งตัวลงในแอปพลิเคชันเว็บที่เขียนไม่ดีซึ่งถูกปรับใช้ในช่วงปลายยุค 90
Elliot Nelson

4
จะต้องมีคิวเพื่อทำงาน: `$ (" div [id = '"+ ตัวแปร +"'] ")" หรือ `$ (" 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 docs กำลังเพิ่มเพียงหนึ่ง "\" (เครื่องหมายทับ) การแจ้งเตือน (escapeSelector ( "some.id")); จะส่งออกเป็นบาง \. id ดังนั้นฉันคิดว่าการแทนที่ regex ควรเป็น s.replace (/(::\\\\\\\\\\\\\ ส่วนบุคคล "\\\ $ 1");
อรุณ

ฉันมีปัญหาเดียวกันทำไมไม่มีใครเห็นสิ่งนี้
TruthOf42

9

Release Candidate ของ 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
เจสันตอม่อ

7
จุดมีความหมายพิเศษใน CSS เพื่อระบุ / รวมคลาสซึ่งเป็นสาเหตุที่การมี ID ในนั้นลำบาก "ปัญหา" ไม่ได้มี jquery
Funka

4

นี่คือเอกสารในเอกสารjQuery Selectors :

การใช้ใด ๆ ของตัวละครเมตา (เช่น !"#$%&'()*+,./:;<=>?@[\]^`{|}~) \\เป็นส่วนหนึ่งของความหมายของชื่อก็ต้องหนีไปกับสองทับขวา: ยกตัวอย่างเช่นเป็นองค์ประกอบที่มีความ สามารถใช้ตัวเลือกid="foo.bar"$("#foo\\.bar")

ในระยะสั้นคำนำหน้า.ด้วย\\ดังนี้:

$("#Address\\.Country")

ทำไม.รหัสประจำตัวของฉันไม่ทำงาน

ปัญหาคือ.มีความสำคัญเป็นพิเศษสตริงต่อไปนี้ถูกตีความว่าเป็นตัวเลือกชั้นเรียน ดังนั้นจะตรงกับ$('#Address.Country')<div id="Address" class="Country">

เมื่อหนีเป็นจุดจะถือว่าเป็นข้อความปกติที่ไม่มีความสำคัญเป็นพิเศษที่ตรงกับหมายเลขที่คุณต้องการ\\.<div id="Address.Country">

สิ่งนี้ใช้กับตัวละครทั้งหมด!"#$%&'()*+,./:;<=>?@[\]^`{|}~ที่มีนัยสำคัญเป็นพิเศษในตัวเลือกใน jQuery เพียงเติม\\ให้ถือว่าเป็นข้อความธรรมดา

ทำไม 2 \\?

ดังที่ระบุไว้ในคำตอบ bdukes มีเหตุผลที่เราต้องการ 2 \ตัวอักษร \จะหลบหนีอักขระต่อไปนี้ใน JavaScript Se เมื่อตีความ 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 รุ่น #

ฉันได้ใช้วิธีการขยายของฉันเองเช่น Html.TextBoxFixed เป็นต้นซึ่งแทนที่จุดที่มีเครื่องหมายขีดล่างในแอตทริบิวต์ id (ไม่ใช่ในแอตทริบิวต์ name) เพื่อให้คุณใช้ jquery เช่น $ ("# Address_Street") แต่บนเซิร์ฟเวอร์มันก็เหมือนกับ 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 helper การโทร HTML helper ใช้จุดเพราะนั่นเป็นวิธี 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 พร้อมตัวอักษรพิเศษ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.