Meskipun kadang-kadang mungkin, itu tidak pernah valid.
Paul Creasey
2
Dengan semua yang disebutkan di atas, perlu dicatat bahwa kemungkinan akan menemukan banyak ID yang sama dalam dokumen dengan konten yang dibuat oleh agen-pengguna (kerangka pikir, mv *, reaksi, polimer ...). Itu kalau ada yang bertanya-tanya mengapa situs XYZ tampak sangat profesional penuh dengan coding praktek yang buruk .
@corsiKa konsekuensinya adalah perilaku yang tidak terdefinisi, misalnya, apa yang document.getElementById ("# foo") atau $ ("# foo") kembali ketika ada beberapa #foos? Anda akan mengalami masalah karena dapat bekerja dengan elemen-elemen ini dari JS, meneruskannya sebagai penyeleksi ke perpustakaan / API / Flash, dll.
mrooney
76
Ini salah. Sangat mungkin untuk memiliki beberapa elemen dengan ID yang sama. Ini umumnya bukan praktik terbaik , tetapi memang memiliki kegunaan sesekali. Semua orang tampaknya mengutip bagaimana penyeleksi akan bekerja, baik jika Anda tahu bahwa Anda akan memiliki ID yang bertentangan, Anda menggunakan penyeleksi Anda dengan orang tua, di mana ID di bawah orang tua akan unik. misalnya $('div#car span#size)dan $('div#truck span#size').
BJury
18
mengapa bahkan menggunakan beberapa id serupa ketika Anda mendapat kelas untuk tujuan ini?
Max Yari
6
Ya, beberapa ID dapat, dalam praktiknya, diganti dengan menggunakan kelas. Namun, kelas dimaksudkan untuk menerapkan gaya, bukan mengidentifikasi elemen, membuat cakupan nama jauh lebih luas dan karenanya cenderung tumpang tindih. Terutama jika menggunakan perpustakaan pihak ke-3. Id sebagai 'pengidentifikasi' tidak dimaksudkan untuk dikalikan sehingga jelas ada kebutuhan untuk sesuatu di antaranya. Penggunaan praktis adalah komponen dari bagian halaman / dom ke dalam unit logis terpisah. Diperlukan penggunaan (setidaknya) identifikasi 2-lapisan.
Alen Siljak
85
Saya pikir ada perbedaan antara apakah sesuatu HARUS unik atau HARUS unik (yaitu diberlakukan oleh browser web).
Haruskah ID unik? IYA.
Haruskah ID unik? TIDAK, setidaknya IE dan FireFox memungkinkan beberapa elemen memiliki ID yang sama.
Begitu juga Chrome (v22 pada saat komentar ini ditulis). : D
omninonsense
27
Menurut spec , ini HARUS, TIDAK HARUS. (Apakah masih berfungsi di sebagian besar peramban? Ya. Apakah ini HTML yang valid? Tidak. Selain itu, karena getElementById, dalam kasus tersebut undefined, berarti tidak ada cara untuk mengetahui bagaimana peramban mungkin memilih untuk menanganinya.)
leo
2
@leo namun ini adalah dunia nyata di mana browser tidak sepenuhnya sesuai dengan standar. Dalam hal ini bisa menjadi hal yang baik, karena tidak ada alasan untuk menegakkan ID unik.
BJury
1
Di HTML5, spesifikasi untuk getElementByIdbenar - benar menentukan bahwa elemen pertama dengan ID yang diberikan harus dikembalikan (begitulah semua browser saat ini menangani situasi) - lihat jawaban saya di bawah ini untuk informasi lebih lanjut.
mltsy
1
Jangan menangis, gunakan jQuery. @leo
Máxima Alekz
67
Bisakah beberapa elemen memiliki ID yang sama?
Ya - apakah itu tag yang sama atau tidak, browser akan merender halaman meskipun beberapa elemen memiliki ID yang sama.
Apa konsekuensi dari jenis HTML yang tidak valid ini?
Sebagian besar (jika tidak semua) browser telah dipilih dan masih jangan pilih elemen pertama dengan ID yang diberikan, saat memanggil getElementById. Sebagian besar perpustakaan yang menemukan elemen dengan ID mewarisi perilaku ini. Sebagian besar (jika tidak semua) browser juga menerapkan gaya yang ditetapkan oleh pemilih-id (mis. #myid) Untuk semua elemen dengan ID yang ditentukan. Jika ini yang Anda harapkan dan niatkan, maka tidak ada konsekuensi yang tidak diinginkan. Jika Anda mengharapkan / bermaksud sesuatu yang lain (misalnya untuk semua elemen dengan ID yang akan dikembalikan, atau agar gaya hanya berlaku untuk satu elemen) maka harapan Anda tidak akan terpenuhi dan fitur apa pun yang mengandalkan harapan itu akan gagal.
Beberapa perpustakaan javascript memang memiliki harapan yang tidak terpenuhi ketika beberapa elemen memiliki ID yang sama (lihat komentar wootscootinboogie tentang d3.js)
Kesimpulan
Yang terbaik adalah tetap berpegang pada standar, tetapi jika Anda tahu kode Anda berfungsi seperti yang diharapkan di lingkungan Anda saat ini, dan ID ini digunakan dengan cara yang dapat diprediksi / dipelihara, maka hanya ada 2 alasan praktis untuk tidak melakukan ini:
Untuk menghindari kemungkinan Anda salah, dan salah satu perpustakaan yang Anda gunakan sebenarnya tidak berfungsi ketika beberapa elemen memiliki ID yang sama.
Untuk menjaga kompatibilitas-depan situs web / aplikasi Anda dengan perpustakaan atau layanan (atau pengembang!) Yang mungkin Anda temui di masa depan, yang tidak berfungsi ketika beberapa elemen memiliki ID yang sama - yang merupakan kemungkinan yang masuk akal karena ini, secara teknis, tidak valid HTML.
Jawaban yang sangat bagus. itu selalu terbaik jika Anda tetap pada standar.
EKanadily
25
Bahkan jika elemen-elemen dari tipe yang berbeda itu dapat menyebabkan Anda beberapa masalah serius ...
Misalkan Anda memiliki 3 tombol dengan id yang sama:
<buttonid="myid"data-mydata="this is button 1">button 1</button><buttonid="myid"data-mydata="this is button 2">button 2</button><buttonid="myid"data-mydata="this is button 3">button 3</button>
Sekarang Anda menyiapkan beberapa jQuerykode untuk melakukan sesuatu ketika myidtombol diklik:
Apa yang kamu harapkan? Setiap tombol yang diklik akan menjalankan pengaturan event handler klik dengan jQuery. Sayangnya itu tidak akan terjadi. HANYA tombol pertama memanggil penangan klik. 2 lainnya ketika diklik tidak melakukan apa-apa. Seolah-olah itu bukan tombol sama sekali!
Jadi selalu tetapkan berbeda IDsuntuk HTMLelemen. Ini akan membuat Anda tertutup terhadap hal-hal aneh. :)
<buttonid="button1"class="mybtn"data-mydata="this is button 1">button 1</button><buttonid="button2"class="mybtn"data-mydata="this is button 2">button 2</button><buttonid="button3"class="mybtn"data-mydata="this is button 3">button 3</button>
Sekarang jika Anda ingin event handler klik dijalankan ketika salah satu tombol diklik, itu akan berfungsi dengan baik jika Anda mengubah pemilih dalam kode jQuery untuk menggunakan CSSkelas yang diterapkan pada mereka seperti ini:
bagaimana jika saya memiliki "konten" yang sudah saya referensikan dalam sebuah variabel, dan #kontensi # my-div yang hanya saya miliki untuk beberapa saat setelah itu saya menghapus simpul yang direferensikan dan melupakan variabelnya, setelah itu # div #content melakukan myDiv.outerHTML = myDiv.innerHTML untuk mengganti yang asli. Ini menghemat kebutuhan untuk menyalin semua gaya dan konten #content ke #decoy dan melakukan hal yang sama. Ini masuk akal ketika melakukan transisi.
Dmitry
Ini berarti bahwa, walaupun saya menggunakan 'append' untuk menambahkan beberapa elemen dari id yang sama, DOM hanya menganggap elemen pertama sebagai nyata, idealnya 1 ID = 1 Elemen
Karan Kaw
22
Dua elemen dengan id yang sama tidak valid. ID unik, jika Anda ingin melakukan hal seperti itu, gunakan kelas. Jangan lupa bahwa elemen dapat memiliki beberapa kelas dengan menggunakan spasi sebagai delimeter:
Spek resmi untuk HTML menyatakan bahwa tag id harus unik DAN spek resmi juga menyatakan bahwa jika render dapat diselesaikan, itu harus (yaitu tidak ada yang namanya "kesalahan" dalam HTML, hanya HTML "tidak valid"). Jadi, berikut ini adalah bagaimana sebenarnya tag id berfungsi dalam praktik . Semuanya tidak valid , tetapi masih berfungsi:
Render baik di semua browser. Namun, document.getElementById hanya mengembalikan objek, bukan array; Anda hanya akan dapat memilih div pertama melalui tag id. Jika Anda mengubah id div pertama menggunakan JavaScript, ID kedua akan dapat diakses dengan document.getElementById (diuji pada Chrome, FireFox & IE11). Anda masih dapat memilih div menggunakan metode pemilihan lain, dan properti id-nya akan dikembalikan dengan benar.
Harap perhatikan bahwa masalah di atas membuka kerentanan keamanan potensial di situs yang membuat gambar SVG, karena SVG diizinkan mengandung elemen DOM, dan juga tag id pada mereka (memungkinkan skrip pengalihan DOM melalui gambar yang diunggah). Selama SVG diposisikan di DOM sebelum elemen itu diganti, gambar akan menerima semua peristiwa JavaScript yang dimaksudkan untuk elemen lainnya.
Masalah ini saat ini tidak di radar siapa pun sejauh yang saya tahu, namun ini nyata.
Ini:
<divid="unique"id="unique-also">One</div>
Juga menjadikan baik di semua browser. Namun, hanya id pertama yang Anda tentukan dengan cara ini yang digunakan, jika Anda mencoba document.getElementById ('unik-juga'); dalam contoh di atas, Anda akan dikembalikan nol (diuji pada Chrome, FireFox & IE11).
Ini:
<divid="unique unique-two">Two</div>
Namun, juga menjadikan baik di semua browser, tidak seperti tag kelas yang dapat dipisahkan oleh spasi, tag id memungkinkan spasi, sehingga id elemen di atas sebenarnya "unik unik-dua", dan meminta dom untuk "unik" atau "unik-dua" dalam isolasi menghasilkan nol kecuali ditentukan lain di DOM (diuji pada Chrome, FireFox & IE11).
"tag id memungkinkan spasi" - Meskipun, menurut spesifikasi , "Nilai tersebut tidak boleh mengandung karakter spasi apa pun."
MrWhite
Saya setuju. Namun, ada spek, dan ada cara browser beroperasi. Browser secara historis memperlakukan spek sebagai sesuatu tujuan, tetapi tidak ketat pada banyak item. Saya pikir mereka melakukan ini karena jika mereka memenuhi spesifikasi itu akan merusak banyak situs yang ada atau sesuatu. Saya menyebutkan di atas bahwa meskipun hal-hal ini berfungsi, mereka tidak valid.
Nick Steele
5
Jawaban SLaks benar, tetapi sebagai catatan tambahan bahwa spesifikasi x / html menentukan bahwa semua id harus unik dalam dokumen html (tunggal) . Meskipun tidak persis apa yang diminta op, mungkin ada contoh yang valid di mana id yang sama dilampirkan ke entitas yang berbeda di beberapa halaman.
Contoh:
(disajikan ke peramban modern) artikel # konten utama { gaya satu arah }
(disajikan ke lawas) div # konten utama { gaya lain }
Mungkin antipattern. Hanya pergi dari sini sebagai titik advokat iblis.
Poin yang bagus. Meskipun konten yang dihasilkan secara dinamis yang seharusnya dimasukkan ke halaman lain harus menghindari id sama sekali. Id seperti global dalam bahasa pemrograman, Anda dapat menggunakannya, dan ada kasus yang valid di mana itu adalah peretasan bagus yang menyederhanakan banyak hal. Merupakan praktik yang baik untuk mempertimbangkan melakukan sesuatu dengan benar sebelum melakukan peretasan.
psiko brm
4
Dan untuk apa nilainya, setidaknya pada Chrome 26.0.1410.65, Firefox 19.0.2, dan Safari 6.0.3, jika Anda memiliki beberapa elemen dengan ID yang sama, penyeleksi jquery (setidaknya) akan mengembalikan elemen pertama dengan ID tersebut.
misalnya
<divid="one">first text for one</div><divid="one">second text for one</div>
Line9,Column14:Duplicate ID x.<div id="x">was</div>WarningLine8,Column14:The first occurrence of ID x was here.<div id="x">Barry</div>ErrorLine10,Column14:Duplicate ID x.<div id="x">here</div>WarningLine8,Column14:The first occurrence of ID x was here.<div id="x">Barry</div>
... tetapi OP secara khusus menyatakan - bagaimana dengan tipe elemen yang berbeda. Jadi pertimbangkan HTML berikut ...
Kita bisa menggunakan nama kelas daripada menggunakan id. id html harus unik tetapi kelas tidak. ketika mengambil data menggunakan nama kelas dapat mengurangi jumlah baris kode dalam file js Anda.
Saya pikir Anda tidak dapat melakukannya karena saya unik Anda harus menggunakannya untuk satu elemen. Anda dapat menggunakan kelas untuk tujuan tersebut
id hanya mengandung elemen div pertama. Jadi walaupun ada beberapa elemen dengan id yang sama, objek dokumen hanya akan mengembalikan kecocokan pertama.
Apakah mungkin untuk memiliki lebih dari satu siswa di kelas yang memiliki Roll / Id no yang sama? Dalam idatribut HTML seperti itu. Anda dapat menggunakan kelas yang sama untuk mereka. misalnya:
<divclass="a b c"></div><divclass="a b c d"></div>
Biasanya, lebih baik tidak menggunakan ID yang sama beberapa kali di halaman html. Meski begitu, dimungkinkan untuk menggunakan ID yang sama berkali-kali dalam satu halaman. Namun ketika Anda menggunakan ID sebagai bagian dari URI / URL seperti di bawah ini:
Saya tidak tahu apakah semua jawaban ini sudah ketinggalan zaman, tetapi buka saja youtube dan periksa html. Cobalah untuk memeriksa video yang disarankan, Anda akan melihat bahwa mereka semua memiliki Id yang sama dan struktur berulang seperti berikut:
Jawaban:
Tidak.
ID elemen harus unik di seluruh dokumen.
sumber
$('div#car span#size)
dan$('div#truck span#size')
.Saya pikir ada perbedaan antara apakah sesuatu HARUS unik atau HARUS unik (yaitu diberlakukan oleh browser web).
Haruskah ID unik? IYA.
Haruskah ID unik? TIDAK, setidaknya IE dan FireFox memungkinkan beberapa elemen memiliki ID yang sama.
sumber
getElementById
, dalam kasus tersebutundefined
, berarti tidak ada cara untuk mengetahui bagaimana peramban mungkin memilih untuk menanganinya.)getElementById
benar - benar menentukan bahwa elemen pertama dengan ID yang diberikan harus dikembalikan (begitulah semua browser saat ini menangani situasi) - lihat jawaban saya di bawah ini untuk informasi lebih lanjut.Bisakah beberapa elemen memiliki ID yang sama?
Ya - apakah itu tag yang sama atau tidak, browser akan merender halaman meskipun beberapa elemen memiliki ID yang sama.
Apakah itu HTML yang Benar?
Tidak. Ini masih berlaku pada spesifikasi HTML 5.1 . Namun, spesifikasi juga mengatakan
getElementById
harus mengembalikan elemen pertama dengan ID yang diberikan , membuat perilaku tidak terdefinisi dalam kasus dokumen yang tidak valid.Apa konsekuensi dari jenis HTML yang tidak valid ini?
Sebagian besar (jika tidak semua) browser telah dipilih dan masih jangan pilih elemen pertama dengan ID yang diberikan, saat memanggil
getElementById
. Sebagian besar perpustakaan yang menemukan elemen dengan ID mewarisi perilaku ini. Sebagian besar (jika tidak semua) browser juga menerapkan gaya yang ditetapkan oleh pemilih-id (mis.#myid
) Untuk semua elemen dengan ID yang ditentukan. Jika ini yang Anda harapkan dan niatkan, maka tidak ada konsekuensi yang tidak diinginkan. Jika Anda mengharapkan / bermaksud sesuatu yang lain (misalnya untuk semua elemen dengan ID yang akan dikembalikan, atau agar gaya hanya berlaku untuk satu elemen) maka harapan Anda tidak akan terpenuhi dan fitur apa pun yang mengandalkan harapan itu akan gagal.Beberapa perpustakaan javascript memang memiliki harapan yang tidak terpenuhi ketika beberapa elemen memiliki ID yang sama (lihat komentar wootscootinboogie tentang d3.js)
Kesimpulan
Yang terbaik adalah tetap berpegang pada standar, tetapi jika Anda tahu kode Anda berfungsi seperti yang diharapkan di lingkungan Anda saat ini, dan ID ini digunakan dengan cara yang dapat diprediksi / dipelihara, maka hanya ada 2 alasan praktis untuk tidak melakukan ini:
Kekuatan itu milikmu!
sumber
Bahkan jika elemen-elemen dari tipe yang berbeda itu dapat menyebabkan Anda beberapa masalah serius ...
Misalkan Anda memiliki 3 tombol dengan id yang sama:
Sekarang Anda menyiapkan beberapa
jQuery
kode untuk melakukan sesuatu ketikamyid
tombol diklik:Apa yang kamu harapkan? Setiap tombol yang diklik akan menjalankan pengaturan event handler klik dengan jQuery. Sayangnya itu tidak akan terjadi. HANYA tombol pertama memanggil penangan klik. 2 lainnya ketika diklik tidak melakukan apa-apa. Seolah-olah itu bukan tombol sama sekali!
Jadi selalu tetapkan berbeda
IDs
untukHTML
elemen. Ini akan membuat Anda tertutup terhadap hal-hal aneh. :)Sekarang jika Anda ingin event handler klik dijalankan ketika salah satu tombol diklik, itu akan berfungsi dengan baik jika Anda mengubah pemilih dalam kode jQuery untuk menggunakan
CSS
kelas yang diterapkan pada mereka seperti ini:sumber
Dua elemen dengan id yang sama tidak valid. ID unik, jika Anda ingin melakukan hal seperti itu, gunakan kelas. Jangan lupa bahwa elemen dapat memiliki beberapa kelas dengan menggunakan spasi sebagai delimeter:
sumber
Spek resmi untuk HTML menyatakan bahwa tag id harus unik DAN spek resmi juga menyatakan bahwa jika render dapat diselesaikan, itu harus (yaitu tidak ada yang namanya "kesalahan" dalam HTML, hanya HTML "tidak valid"). Jadi, berikut ini adalah bagaimana sebenarnya tag id berfungsi dalam praktik . Semuanya tidak valid , tetapi masih berfungsi:
Ini:
Render baik di semua browser. Namun, document.getElementById hanya mengembalikan objek, bukan array; Anda hanya akan dapat memilih div pertama melalui tag id. Jika Anda mengubah id div pertama menggunakan JavaScript, ID kedua akan dapat diakses dengan document.getElementById (diuji pada Chrome, FireFox & IE11). Anda masih dapat memilih div menggunakan metode pemilihan lain, dan properti id-nya akan dikembalikan dengan benar.
Harap perhatikan bahwa masalah di atas membuka kerentanan keamanan potensial di situs yang membuat gambar SVG, karena SVG diizinkan mengandung elemen DOM, dan juga tag id pada mereka (memungkinkan skrip pengalihan DOM melalui gambar yang diunggah). Selama SVG diposisikan di DOM sebelum elemen itu diganti, gambar akan menerima semua peristiwa JavaScript yang dimaksudkan untuk elemen lainnya.
Masalah ini saat ini tidak di radar siapa pun sejauh yang saya tahu, namun ini nyata.
Ini:
Juga menjadikan baik di semua browser. Namun, hanya id pertama yang Anda tentukan dengan cara ini yang digunakan, jika Anda mencoba document.getElementById ('unik-juga'); dalam contoh di atas, Anda akan dikembalikan nol (diuji pada Chrome, FireFox & IE11).
Ini:
Namun, juga menjadikan baik di semua browser, tidak seperti tag kelas yang dapat dipisahkan oleh spasi, tag id memungkinkan spasi, sehingga id elemen di atas sebenarnya "unik unik-dua", dan meminta dom untuk "unik" atau "unik-dua" dalam isolasi menghasilkan nol kecuali ditentukan lain di DOM (diuji pada Chrome, FireFox & IE11).
sumber
Jawaban SLaks benar, tetapi sebagai catatan tambahan bahwa spesifikasi x / html menentukan bahwa semua id harus unik dalam dokumen html (tunggal) . Meskipun tidak persis apa yang diminta op, mungkin ada contoh yang valid di mana id yang sama dilampirkan ke entitas yang berbeda di beberapa halaman.
Contoh:
(disajikan ke peramban modern) artikel # konten utama { gaya satu arah }
(disajikan ke lawas) div # konten utama { gaya lain }
Mungkin antipattern. Hanya pergi dari sini sebagai titik advokat iblis.
sumber
Dan untuk apa nilainya, setidaknya pada Chrome 26.0.1410.65, Firefox 19.0.2, dan Safari 6.0.3, jika Anda memiliki beberapa elemen dengan ID yang sama, penyeleksi jquery (setidaknya) akan mengembalikan elemen pertama dengan ID tersebut.
misalnya
dan
Lihat http://jsfiddle.net/RuysX/ untuk tes.
sumber
div#one
Itu tentu saja tidak mengubah fakta bahwa itu tidak valid.Nah, menggunakan validator HTML di w3.org , khusus untuk HTML5, ID harus unik
Pertimbangkan yang berikut ...
validator merespons dengan ...
... tetapi OP secara khusus menyatakan - bagaimana dengan tipe elemen yang berbeda. Jadi pertimbangkan HTML berikut ...
... hasil dari validator adalah ...
Kesimpulan:
Dalam kedua kasus (tipe elemen yang sama, atau tipe elemen yang berbeda), jika id digunakan lebih dari sekali, itu tidak dianggap HTML5 yang valid.
sumber
Kita bisa menggunakan nama kelas daripada menggunakan id. id html harus unik tetapi kelas tidak. ketika mengambil data menggunakan nama kelas dapat mengurangi jumlah baris kode dalam file js Anda.
sumber
Saya pikir Anda tidak dapat melakukannya karena saya unik Anda harus menggunakannya untuk satu elemen. Anda dapat menggunakan kelas untuk tujuan tersebut
sumber
id hanya mengandung elemen div pertama. Jadi walaupun ada beberapa elemen dengan id yang sama, objek dokumen hanya akan mengembalikan kecocokan pertama.
sumber
Tidak, ID harus unik. Anda dapat menggunakan kelas untuk tujuan itu
sumber
Apakah mungkin untuk memiliki lebih dari satu siswa di kelas yang memiliki Roll / Id no yang sama? Dalam
id
atribut HTML seperti itu. Anda dapat menggunakan kelas yang sama untuk mereka. misalnya:Dan seterusnya.
sumber
Biasanya, lebih baik tidak menggunakan ID yang sama beberapa kali di halaman html. Meski begitu, dimungkinkan untuk menggunakan ID yang sama berkali-kali dalam satu halaman. Namun ketika Anda menggunakan ID sebagai bagian dari URI / URL seperti di bawah ini:
https://en.wikipedia.org/wiki/FIFA_World_Cup#2015_FIFA_corruption_case
Dan jika ID ('2015_FIFA_corruption_case') digunakan hanya untuk satu (rentang) elemen di halaman web:
Tidak akan ada masalah. Sebaliknya, ID yang sama ada di lebih dari satu tempat, browser akan menjadi bingung.
sumber
Ya mereka bisa.
Saya tidak tahu apakah semua jawaban ini sudah ketinggalan zaman, tetapi buka saja youtube dan periksa html. Cobalah untuk memeriksa video yang disarankan, Anda akan melihat bahwa mereka semua memiliki Id yang sama dan struktur berulang seperti berikut:
sumber