Bagaimana cara memilih html node berdasarkan ID dengan jquery ketika id berisi titik?

178

Jika html saya terlihat seperti ini:

<td class="controlCell">
    <input class="inputText" id="SearchBag.CompanyName" name="SearchBag.CompanyName" type="text" value="" />
</td>

Bagaimana saya bisa memilih # SearchBag.CompanyName dengan JQuery? Saya tidak bisa membuatnya bekerja dan saya khawatir titik itulah yang menghancurkan semuanya. Yang menjengkelkan adalah bahwa mengubah nama semua id saya akan menjadi banyak pekerjaan, belum lagi hilangnya keterbacaan.

Catatan:
Tolong jangan mulai berbicara tentang bagaimana tabel tidak dibuat untuk lay-out. Saya sangat menyadari nilai dan kekurangan CSS dan berusaha keras untuk menggunakannya sebanyak mungkin.

Boris Callens
sumber
1
Apakah periode dalam ID bahkan HTML yang valid?
cletus
7
Iya. ID dapat mengandung '-', '_', '.' dan ':'. w3.org/TR/html4/types.html#type-name
bobince
Jeps, halaman saya semua memvalidasi kecuali untuk tag <title> ganda kerangka kerja mvc asp.net ..
Boris Callens

Jawaban:

215

@Tomalak dalam komentar:

karena pemilih ID harus didahului dengan hash #, seharusnya tidak ada ambiguitas di sini

"# Id.class" adalah pemilih yang valid yang membutuhkan id dan kelas terpisah untuk mencocokkan; ini valid dan tidak selalu sepenuhnya berlebihan.

Cara yang benar untuk memilih literal '.' di CSS adalah untuk menghindarinya: "#id \ .moreid". Ini digunakan untuk menyebabkan masalah di beberapa browser lama (khususnya IE5.x), tetapi semua browser desktop modern mendukungnya.

Metode yang sama tampaknya berfungsi di jQuery 1.3.2, meskipun saya belum mengujinya secara menyeluruh; quickExpr tidak mengambilnya, tetapi parser pemilih yang lebih terlibat tampaknya benar:

$('#SearchBag\\.CompanyName');
bobince
sumber
1
"# id.class adalah pemilih yang valid yang membutuhkan id dan kelas terpisah untuk mencocokkan": Sesuai dengan spesifikasi HTML, ID harus unik di seluruh dokumen. Apa yang baik untuk "# id.class"? Maksud saya, Anda tidak dapat lebih spesifik daripada "#id", bukan?
Tomalak
2
@ Tom: "# id.class" mungkin bagus untuk banyak dokumen menggunakan stylesheet yang sama, atau mengatur status dengan skrip sisi klien. Misalnya "# navhome.navselected".
bobince
@obobince: Ya, cletus datang dengan contoh yang sama, dan saya rasa itu valid. Tetap saja terasa aneh bagi saya, dan saya tidak bisa melihat keuntungan asli dari bisa melakukan itu. Terutama dalam terang HTML memungkinkan titik-titik dalam ID dan fakta bahwa Anda selalu dapat menggunakan ".navselected" untuk mencapai hal yang sama.
Tomalak
Anda mungkin, misalnya, ingin #navhome yang dipilih untuk menyala dalam warna yang berbeda dengan #navabout yang dipilih, tetapi properti .navselected lainnya untuk dibagikan. Saya tidak akan mengatakan situasi ini muncul sepanjang waktu, tetapi saya tentu membutuhkannya sesekali.
bobince
3
Saya pikir jawaban @Tomalak lebih elegan, seperti:$('[id="profile.birthdate"]')
dr.dimitru
118

Satu varian adalah ini:

$("input[id='SearchBag.CompanyName']")
Tomalak
sumber
1
Memang. Bisakah Anda memberi tahu saya mengapa solusi Anda berfungsi dan $ ("# SearchBag.CompanyName") tidak?
Boris Callens
9
Karena .CompanyName diperlakukan sebagai pemilih kelas.
cletus
2
Dengan cepat melihat kode sumber, itu adalah keputusan disengaja atau bug. Regex yang digunakan untuk mengidentifikasi pemilih id (bernama quickExpr) tidak menyertakan titik sebagai karakter yang valid. Namun spesifikasi HTML memungkinkannya.
Tomalak
5
Memiliki pemilih kelas pada ID mungkin berguna. Bayangkan Anda memiliki elemen #menu di setiap halaman tetapi ingin membuatnya berbeda di salah satu halaman Anda. # menu.hideme misalnya? Marjinal saya tahu tetapi itu valid.
cletus
2
Ini jelas merupakan jawaban yang unggul. Bekerja juga dengan variabel seperti ini: $ ("tr [id = '" + private_var + "']"). Css ("background-color", "#EEEEEE");
Steve K
33

Anda tidak perlu melarikan diri apa pun jika menggunakan document.getElementById:

$(document.getElementById('strange.id[]'))

getElementById mengasumsikan input hanya atribut id, sehingga titik tidak akan ditafsirkan sebagai pemilih kelas.

Blender
sumber
Solusi rapi, juga berfungsi baik dengan ID dinamis yang mungkin mengandung titik
Cookalino
17

Jawaban Singkat : Jika Anda memiliki elemen dengan id = "foo.bar", Anda dapat menggunakan pemilih$("#foo\\.bar")

Jawaban yang Lebih Panjang : Ini adalah bagian dari dokumentasi jquery - penyeleksi bagian yang dapat Anda temukan di sini: http://api.jquery.com/category/selectors/

Pertanyaan Anda dijawab tepat di awal dokumentasi:

Jika Anda ingin menggunakan salah satu meta-karakter (seperti 
! "# $% & '() * +,. /:;? @ [\] ^` {|} ~) 
sebagai bagian literal dari sebuah nama, Anda harus melarikan diri dari karakter tersebut 
dua backslash: \\. Misalnya, jika Anda memiliki elemen dengan id = "foo.bar",
Anda dapat menggunakan pemilih $ ("# foo \\. bar"). Spesifikasi W3C CSS berisi
seperangkat aturan lengkap tentang pemilih CSS yang valid. Juga bermanfaat adalah
entri blog oleh Mathias Bynens pada urutan pelarian karakter CSS untuk pengidentifikasi.
oneiros
sumber
4
Anda sadar bahwa pertanyaan ini lebih dari tiga tahun dan dokumentasinya mungkin tidak sama, kan?
Reimius
9

pemilihan attr tampaknya sesuai ketika ID Anda dalam variabel:

var id_you_want='foo.bar';
$('[id="' + id_you_want + '"]');
uskup
sumber
4

Hal ini didokumentasikan dalam API jQuery penyeleksi :

Untuk menggunakan salah satu meta-karakter (seperti !"#$%&'()*+,./:;<=>?@[\]^`{|}~) sebagai bagian literal dari sebuah nama, itu harus melarikan diri dengan dengan dua backslashes: \\. Misalnya, elemen dengan id="foo.bar", dapat menggunakan pemilih $("#foo\\.bar").

Singkatnya, awali .dengan \\.

$('#SearchBag\\.CompanyName')

Masalahnya adalah bahwa .akan cocok dengan kelas, jadi $('#SearchBag.CompanyName')akan cocok <div id="SearchBag" class="CompanyName">. Orang yang melarikan diri \\.akan diperlakukan sebagai orang normal .tanpa arti khusus, cocok dengan ID yang Anda inginkan.

Ini berlaku untuk semua karakter !"#$%&'()*+,./:;<=>?@[\]^`{|}~yang seharusnya memiliki arti khusus sebagai pemilih di jQuery.

Jon Surrell
sumber
2

Guys yang mencari solusi yang lebih umum, saya menemukan satu solusi yang menyisipkan satu garis miring ke belakang sebelum karakter khusus, ini menyelesaikan masalah terkait dengan mengambil nama & ID dari div yang berisi karakter khusus.

"Str1.str2% str3" .replace (/ [^ \ w \ s] / gi, '\\ $ &')

mengembalikan "Str1 \\. str2 \\% str3"

Semoga ini bermanfaat!

Abhishek
sumber
1

Anda dapat menggunakan pemilih atribut:

$("[id='SearchBag.CompanyName']");

Atau Anda dapat menentukan jenis elemen:

$("input[id='SearchBag.CompanyName']");
ntrokoli
sumber