Làm cách nào để có được jQuery để chọn các phần tử với a. (thời gian) trong ID của họ?


172

Cho các lớp và phương thức hành động của bộ điều khiển sau:

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 };
}

Và hình thức sau:

<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>

Tôi có thể cập nhật cả phiên bản Trường học và thành viên Địa chỉ của trường. Điều này là khá tốt đẹp! Cảm ơn nhóm ASP.NET MVC!

Tuy nhiên, làm cách nào để sử dụng jQuery để chọn danh sách thả xuống để tôi có thể điền trước nó? Tôi nhận ra rằng tôi có thể làm phía máy chủ này nhưng sẽ có các yếu tố động khác trên trang ảnh hưởng đến danh sách.

Sau đây là những gì tôi có cho đến nay và nó không hoạt động vì các bộ chọn dường như không khớp với 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);
    });
  });
});

Câu trả lời:


293

Từ các nhóm Google :

Sử dụng hai dấu gạch chéo ngược trước mỗi ký tự đặc biệt.

Dấu gạch chéo ngược trong bộ chọn jQuery thoát khỏi ký tự tiếp theo. Nhưng bạn cần hai trong số chúng vì dấu gạch chéo ngược cũng là ký tự thoát cho chuỗi JavaScript. Dấu gạch chéo ngược đầu tiên thoát khỏi dấu gạch chéo thứ hai, cung cấp cho bạn một dấu gạch chéo ngược thực tế trong chuỗi của bạn - sau đó thoát ký tự tiếp theo cho jQuery.

Vì vậy, tôi đoán bạn đang nhìn

$(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);
    });
  });
});

Ngoài ra hãy xem Làm cách nào để tôi chọn một phần tử bằng ID có các ký tự được sử dụng trong ký hiệu CSS? trên Câu hỏi thường gặp về jQuery.


4
Tôi tự hỏi việc hợp lý hóa là gì khi yêu cầu nhà phát triển thực hiện điều này, có vẻ như một tập hợp các heuristic đơn giản trong jQuery sẽ giải quyết vấn đề này, vì không có gì sai với ID trong các giai đoạn trong đó ...
Jason Bunting

5
Nếu bạn không phải thoát, bạn sẽ truy vấn một phần tử bằng Địa chỉ ID và Trạng thái lớp như thế nào (với điều kiện là nếu bạn biết ID bạn không thêm nhiều bằng cách chỉ định lớp, nhưng nó vẫn hợp lệ, tôi sẽ nghĩ sao?
bdukes

12
Vì lý do đó, trong chính CSS, bạn cũng phải thoát một dấu chấm trong ID. Tất cả các jQuery đang làm là yêu cầu bạn tuân theo các quy tắc được đặt ra bởi CSS.
bdukes

6
Bạn cũng có thể chọn theo tên thay vì ID. Ví dụ: $ ('[name = "Địa chỉ.")')
Funka

25

Bạn không thể sử dụng bộ chọn id jQuery nếu id chứa khoảng trắng. Sử dụng bộ chọn thuộc tính:

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

Nếu có thể, hãy xác định loại phần tử là tốt:

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

Tôi thích làm theo cách này hơn là sử dụng các ký tự thoát .... Rõ ràng cách giải quyết tốt nhất là không sử dụng dấu chấm trong id.
GordonB

Không gian không được phép trong id, thậm chí không chấp nhận các ký tự tự do hơn của HTML5. stackoverflow.com/questions/70579/ Mạnh
Jay Blanchard

Đúng, nhưng việc chúng có được phép hay không không quan trọng đối với người nghèo, người bị mắc kẹt khi thêm trang phục cửa sổ vào một ứng dụng web được viết kém được triển khai vào cuối những năm 90.
Elliot Nelson

4
phải có quates để hoạt động: `$ (" div [id = '"+ biến +"'] ")` hoặc `$ (" div [id = 'foo bar'] ")`
olga

Như @olga đã nói, câu trả lời không còn hợp pháp nữa. Cụ thể, bạn sẽ nhận được thông báo lỗi "Lỗi chưa được xử lý: Lỗi cú pháp, biểu thức không được nhận dạng: div [id = foo bar]"
James Moore

13

Thoát khỏi nó cho Jquery:

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

ví dụ sử dụng:

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

thêm thông tin ở đây .


2
Giải pháp theo các tài liệu jQuery là chỉ thêm một "\" (dấu gạch chéo). cảnh báo (escSelector ("some.id")); sẽ xuất ra dưới dạng một số \ .id. Vì vậy, tôi đoán regex thay thế nên là s.replace (/(:|\.|[|[)/g, "\\\\ $ 1");
Arun

Tôi có cùng một vấn đề, tại sao không ai khác thấy điều này?
TruthOf42

9

Ứng cử viên phát hành ASP.NET MVC vừa được phát hành đã khắc phục sự cố này, giờ đây nó thay thế các dấu chấm bằng dấu gạch dưới cho thuộc tính ID.

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

Hiển thị

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

Để biết thêm thông tin, xem ghi chú phát hành, bắt đầu từ trang 14.


1
Tôi không thấy đây là một "sửa chữa" - tại sao ASP.NET MVC phải thay đổi ID thành thứ gì đó mà jQuery cần? Tôi nghĩ rằng jQuery là vấn đề nằm ở chỗ, không sử dụng a. trong một ID.
Jason Bunting

7
dấu chấm có ý nghĩa đặc biệt trong CSS để xác định / kết hợp các lớp, đó là lý do tại sao việc có nó trong ID là rắc rối. "Vấn đề" không phải là với jquery.
Funka

4

Điều này được ghi lại trong các tài liệu jQuery Selector :

Để sử dụng bất kỳ ký tự meta nào (chẳng hạn như !"#$%&'()*+,./:;<=>?@[\]^`{|}~) như một phần nghĩa đen của tên, nó phải được thoát bằng hai dấu gạch chéo ngược : \\. Ví dụ, một phần tử với id="foo.bar", có thể sử dụng bộ chọn $("#foo\\.bar").

Nói tóm lại, tiền tố .với \\như sau:

$("#Address\\.Country")

Tại sao .ID của tôi không hoạt động?

Vấn đề là .có ý nghĩa đặc biệt, chuỗi sau đây được hiểu là một bộ chọn lớp. Vì thế$('#Address.Country') sẽ phù hợp <div id="Address" class="Country">.

Khi thoát dưới dạng \\., dấu chấm sẽ được coi là văn bản bình thường không có ý nghĩa đặc biệt, phù hợp với ID bạn mong muốn<div id="Address.Country"> .

Điều này áp dụng cho tất cả các ký tự !"#$%&'()*+,./:;<=>?@[\]^`{|}~có ý nghĩa đặc biệt như một bộ chọn trong jQuery. Chỉ cần trả trước\\ để coi chúng như văn bản bình thường.

Tại sao 2 \\ ?

Như đã lưu ý trong câu trả lời của bdukes, có một lý do chúng ta cần 2 \ký tự. \sẽ thoát khỏi ký tự sau trong JavaScript. Khi JavaScript diễn giải chuỗi "#Address\.Country", nó sẽ thấy \, giải thích nó có nghĩa là lấy ký tự sau một cách xả rácloại bỏ nó khi chuỗi được truyền vào làm đối số $(). Điều đó có nghĩa là jQuery vẫn sẽ thấy chuỗi như"#Address.Country" .

Đó là nơi thứ hai \đến chơi. Cái đầu tiên bảo JavaScript diễn giải cái thứ hai là một ký tự (không đặc biệt). Điều này có nghĩa là thứ hai sẽ được jQuery nhìn thấy và hiểu rằng sau đây . ký tự là ký tự chữ.

Phù! Có lẽ chúng ta có thể hình dung điều đó.

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

2

Sử dụng hai dấu gạch chéo ngược, nó có thể hoạt động được. Nhưng nếu bạn đang sử dụng một tên động, ý tôi là, một tên biến, bạn sẽ cần thay thế các ký tự.

Nếu bạn không dùng bát để thay đổi tên biến, bạn có thể làm điều này:

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

và hơn bạn có đối tượng jquery của bạn.


0

Chỉ cần thêm thông tin: Kiểm tra vấn đề ASP.NET MVC # 2403 này .

Cho đến khi sự cố được khắc phục, tôi sử dụng các phương thức tiện ích mở rộng của riêng mình như Html.TextBoxFixed, v.v. chỉ đơn giản là thay thế dấu chấm bằng dấu gạch dưới trong thuộc tính id (không phải trong thuộc tính tên), để bạn sử dụng jquery như $ ("# address_Street") nhưng trên máy chủ, nó giống như Địa chỉ .Street.

Mã mẫu sau:

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
từ vấn đề nêu trên: "UpdateModel () sử dụng dấu chấm vì đó là cách các phần tử biểu mẫu xuất hiện. Các phần tử biểu mẫu sử dụng dấu chấm vì đó là cách chúng được chỉ định trong các lệnh gọi trình trợ giúp HTML. Các lệnh gọi trợ giúp HTML sử dụng dấu chấm vì đó là cách ViewData.Eval () hoạt động. Cuối cùng, ViewData.Eval () sử dụng dấu chấm vì đó là cách người ta tách một đối tượng và thuộc tính của nó trong các ngôn ngữ .NET Framework chính. Sử dụng dấu phân cách khác với dấu chấm tại bất kỳ điểm nào trong chuỗi này sẽ phá vỡ dòng chảy cho toàn bộ chuỗi. "
Simon_Weaver

0

Tôi đã giải quyết vấn đề bằng giải pháp được đưa ra bởi các tài liệu jquery

Chức năng của tôi:

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

function jq(myid){


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


}

Lưu ý: tôi xóa "#" vì trong mã của tôi, tôi ghép ID với văn bản khác

Phông chữ: Jquery Docs chọn phần tử có ký tự đặc biệt

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.