A ile öğeleri seçmek için jQuery nasıl edinirim. (nokta) kimliğinde?


172

Aşağıdaki sınıflar ve denetleyici eylem yöntemi göz önüne alındığında:

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

Ve aşağıdaki form:

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

Hem Okul örneğini hem de okulun Adres üyesini güncelleyebiliyorum. Bu çok hoş! ASP.NET MVC ekibine teşekkür ederiz!

Ancak, önceden doldurabilmem için açılır listeyi seçmek için jQuery'i nasıl kullanabilirim? Bu sunucu tarafını yapabileceğimin farkındayım ama sayfada listeyi etkileyen başka dinamik öğeler de olacak.

Şimdiye kadar sahip olduğum şey şu, ve seçiciler kimliklerle eşleşmediği için çalışmıyor:

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

Yanıtlar:


293

Gönderen Google Grupları :

Her özel karakterden önce iki ters eğik çizgi kullanın.

Bir jQuery seçicisindeki ters eğik çizgi bir sonraki karakterden kaçar. Ancak bunlardan ikisine ihtiyacınız var, çünkü ters eğik çizgi aynı zamanda JavaScript dizeleri için kaçış karakteri. İlk ters eğik çizgi ikinciden kaçarak dizenizde gerçek bir ters eğik çizgi verir - bu da jQuery için bir sonraki karakterden kaçar.

Yani, sanırım bakıyorsun

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

Ayrıca , CSS gösterimlerinde kullanılan karakterlerin bulunduğu bir kimliğe sahip bir öğeyi nasıl seçebilirim? jQuery SSS sayfasında.


4
Rasyonelleştirmenin, geliştiricinin bunu yapmasını gerektirdiği için ne olduğunu merak ediyorum, jQuery içindeki basit bir sezgisel tarama seti bu sorunu çözecek gibi görünüyor, çünkü kimlikleriyle ilgili dönemlerde yanlış bir şey yok ...
Jason Bunting

5
Eğer kaçmak zorunda kalmadıysanız, Kimlik Adresi ve sınıf Durumu olan bir öğeyi nasıl sorgulayacaksınız (kimliğini biliyorsanız, sınıfı belirterek fazla eklemediğinizi, ancak yine de geçerli olması gerektiğini, ) düşünüyorsun?
bdukes

12
Bu nedenle, CSS'nin kendisinde, kimlikteki bir noktadan da kaçmanız gerekir. Tüm jQuery, CSS tarafından belirlenen kurallara uymanızı gerektirir.
bdukes

6
Kimlik yerine ada göre de seçebilirsiniz. Örneğin, $ ('[name = "Address.Country"]')
Funka

25

Kimlik boşluk içeriyorsa, jQuery kimlik seçicisini kullanamazsınız. Bir özellik seçici kullanın:

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

Mümkünse, öğe türünü de belirtin:

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

Ben kaçış karakterleri kullanmaktan daha böyle yapmayı tercih ederim .... Açıkçası en iyi çözüm kimliği dönemleri kullanmak değil.
GordonB

Kimliklerde boşluklara izin verilmez, HTML5'in daha liberal karakter kabulünde bile. stackoverflow.com/questions/70579/…
Jay Blanchard

Doğru, ancak izin verilip verilmeyecekleri , 90'ların sonlarında dağıtılan kötü yazılmış bir web uygulamasına pencere örtüsü ekleyen sıkışmış fakir sap için önemli değil.
Elliot Nelson

4
çalışmak için quates olmalı: `$ (" div [id = '"+ değişken +"'] ")` veya `$ (" div [id = 'foo bar'] ")`
olga

@Olga'nın dediği gibi, cevap artık yasal değil. Özellikle, "Yakalanmayan Hata: Sözdizimi hatası, tanınmayan ifade: div [id = foo bar]" hata mesajı alıyorsunuz
James Moore

13

Jquery için kaçış:

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

kullanım örneği:

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

daha fazla bilgi burada .


2
JQuery belgelerine göre çözüm yalnızca bir "\" (eğik çizgi) eklemektir. alert (escapeSelector ( "some.id")); bazı \ .id olarak çıktılar. Bence regex yerine s.replace olmalıydı (/(:|\.|||mıyor)/g, "\\\\ 1 $");
Arun

Aynı sorunum var, neden başka kimse görmüyor?
TruthOf42

9

Yeni yayımlanan ASP.NET MVC'nin Yayın Adayı bu sorunu çözdü, şimdi noktalar ID özniteliğinin alt çizgileriyle değiştiriliyor.

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

Oluşturur

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

Daha fazla bilgi için sayfa 14'ten başlayarak sürüm notlarına bakın.


1
Bu nasıl bir "düzeltme" göremiyorum - neden ASP.NET MVC jQuery ihtiyacı bir şey için kimliği değiştirmek zorunda? Bence jQuery sorunun nerede yatıyor, kullanarak değil. bir kimlik.
Jason Bunting

7
noktanın sınıfları tanımlamak / birleştirmek için CSS'de özel bir anlamı vardır, bu yüzden bir kimliğe sahip olmak zahmetlidir. "Sorun" jquery ile değil.
Funka

4

Bu, jQuery Seçiciler belgelerinde belgelenmiştir :

Meta-karakterler (örneğin herhangi birini kullanmak için !"#$%&'()*+,./:;<=>?@[\]^`{|}~bir isim bir hazır parçası olarak), iki ters eğik çizgi ile birlikte öncelenmelidirler: \\. Örneğin, ile bir öğe id="foo.bar"seçiciyi kullanabilir $("#foo\\.bar").

Kısacası, öneki .ile \\aşağıdaki gibi:

$("#Address\\.Country")

.Kimliğimde neden çalışmıyor ?

Sorun şu ki ., özel bir önemi vardır, aşağıdaki dize bir sınıf seçici olarak yorumlanır. Yani $('#Address.Country')eşleşir <div id="Address" class="Country">.

Olarak çıkıldığında \\., nokta, istediğiniz herhangi bir kimlikle eşleşen, özel bir önemi olmayan normal metin olarak kabul edilir <div id="Address.Country">.

Bu !"#$%&'()*+,./:;<=>?@[\]^`{|}~, aksi takdirde jQuery'de seçici olarak özel bir öneme sahip olan tüm karakterler için geçerlidir . \\Bunları normal metin gibi ele almanız yeterlidir .

Neden 2 \\?

Bdukes cevabında belirtildiği gibi, 2 \karaktere ihtiyacımız var . \JavaScript'te aşağıdaki karakterden kaçacaktır. JavaScript dize yorumladığı Se zaman "#Address\.Country", bu göreceksiniz \, demek yorumlamak litterally aşağıdaki karakterini almak ve kaldırmak dize kadar argüman olarak geçirilen zaman bunu $(). Bu, jQuery'nin dizgiyi hala göreceği anlamına gelir "#Address.Country".

İkincisi \oyuna giriyor. Birincisi JavaScript'e ikincisini değişmez (özel olmayan) bir karakter olarak yorumlamasını söyler. Bu, ikincisinin jQuery tarafından görüleceği ve aşağıdaki . karakterin değişmez bir karakter olduğunu anlayacağı anlamına gelir .

Uf! Belki bunu görselleştirebiliriz.

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

2

İki Ters Eğik çizgi kullanarak sorun değil, işe yarıyor. Ancak dinamik bir ad kullanıyorsanız, yani değişken bir ad kullanıyorsanız, karakterleri değiştirmeniz gerekir.

Değişken adlarınızı değiştirmek istemiyorsanız bunu yapabilirsiniz:

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

ve jquery nesneniz var.


0

Ek bilgi: Bu ASP.NET MVC sorunu # 2403'ü kontrol edin .

Sorun çözülene kadar, html gibi $ ("# Address_Street") kullanmanız için noktaları id özelliğinde alt çizgilerle değiştiren Html.TextBoxFixed, vb. Gibi kendi uzantı yöntemlerimi kullanıyorum. ama sunucuda Address.Street gibi.

Örnek kod aşağıdaki gibidir:

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 () nokta kullanır, çünkü form öğeleri bu şekilde gelir. Form öğeleri nokta kullanır, çünkü HTML yardımcı çağrılarında bu şekilde belirtilir. HTML yardımcı çağrıları nokta kullanır, çünkü ViewData.Eval () çalışır. Son olarak, ViewData.Eval () bir nokta kullanır, çünkü bir nesne ve onun ana .NET Framework dillerinde özelliğini ayırır.Bu zincirdeki herhangi bir noktada bir nokta dışında bir sınırlayıcı kullanmak kesilir tüm zincir için akış. "
Simon_Weaver

0

Sorunu jquery dokümanlar tarafından verilen çözümle çözdüm

Benim fonksiyonum:

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

function jq(myid){


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


}

Not: "#" kodunu kaldırıyorum çünkü kodumda kimliği başka bir metinle birleştiriyorum

Yazı tipi: Jquery Docs özel karakterlere sahip öğeyi seç

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.