Atribut Non-Standar pada Tag HTML. Hal baik? Sesuatu yang buruk? Pikiran Anda?

92

HTML (atau mungkin hanya XHTML?) Relatif ketat dalam hal atribut non-standar pada tag. Jika bukan bagian dari spesifikasi, kode Anda dianggap tidak patuh.

Namun, atribut non-standar bisa sangat berguna untuk meneruskan meta-data ke Javascript. Misalnya, jika tautan seharusnya menampilkan munculan, Anda dapat menyetel nama munculan di atribut:

<a href="#null" class="popup" title="See the Popup!" 
   popup_title="Title for My Popup">click me</a>

Atau, Anda dapat menyimpan judul untuk popup di elemen tersembunyi, seperti span:

<style>
    .popup .title { display: none; }
</style>
<a href="#null" title="See the Popup!" class="popup">
    click me
    <span class="title">Title for My Popup</span>
</a>

Namun saya ragu mana yang harus menjadi metode yang disukai. Metode pertama lebih ringkas dan, saya rasa, tidak terlalu banyak mengacaukan mesin pencari dan pembaca layar. Sebaliknya, opsi kedua membuat penyimpanan data dalam jumlah besar menjadi lebih mudah dan karenanya, lebih fleksibel. Itu juga sesuai dengan standar.

Saya ingin tahu apa pendapat komunitas ini. Bagaimana Anda menangani situasi seperti ini? Apakah kesederhanaan metode pertama lebih besar daripada potensi kerugiannya (jika ada)?

dave mankoff
sumber
3
Ini disebut atribut "perluasan" - jika Anda ingin mempelajarinya lebih lanjut.
Jason Bunting
2
AFAIK, atribut perluasan ditetapkan pada waktu proses menggunakan javascript. Mereka bukan bagian dari XHTML itu sendiri
Philippe Leybaert

Jawaban:

50

Saya penggemar berat solusi HTML 5 yang diusulkan ( data-atribut awalan). Sunting: Saya akan menambahkan bahwa mungkin ada contoh yang lebih baik untuk penggunaan atribut khusus. Misalnya, data yang akan digunakan aplikasi khusus yang tidak memiliki analog dalam atribut standar (misalnya, penyesuaian untuk penangan peristiwa berdasarkan sesuatu yang tidak dapat selalu diekspresikan dalam className atau id).

kelopak mata
sumber
2
Saya cenderung mengikuti solusi ini sekarang - meskipun tidak sesuai standar.
Tom Ritter
1
Saya selalu menghindari ini, karena tidak valid. Tapi sekarang setelah saya memikirkannya, menjejalkan semua yang ada dalam atribut class = "" (seperti metadata jquery) belum tentu lebih baik. Apakah ada kerugian praktis dan dunia nyata untuk metode ini di <HTML5 land? Pada dasarnya - masalah apa yang akan muncul sekarang? Sepertinya itu tidak ideal, tetapi tidak memiliki efek samping yang dapat saya pikirkan.
rocketmonkeys
@Rocketmonkeys Saya tidak yakin, tetapi saya pikir menggunakan data di dalam atribut kelas, dapat memaksa browser untuk mencoba menerapkan aturan css yang tidak ditentukan ke elemen, ini dapat menyebabkan beberapa masalah atau masalah kinerja. Sekali lagi saya tidak yakin.
Vitim.us
@ Vitim.us, jika ada kinerja seperti itu, itu akan diabaikan. Browser cukup efisien dalam hal-hal semacam itu; hit untuk benar-benar menerapkan gaya akan lebih besar. Dan ingat, kelas bukanlah sesuatu yang diciptakan untuk tujuan penataan, mereka hanya data elemen seperti atribut lainnya. Atribut apa pun dapat digunakan dalam selektor, jadi jika ada kinerja seperti itu, itu akan berlaku untuk atribut apa pun (termasuk data-prefiks) yang Anda tambahkan ke elemen.
Kelopak mata
@eyelidlessness itu argumen yang bagus, saya harus setuju, bahkan saya lebih suka menggunakan struktur data dengan benar di dalam Javascript Saya menemukan beberapa kasus yang menggunakan atribut data cocok. Saya menghindari jquery seperti kata rocketmonkeys. Saya benar-benar perlu berhenti mengganggu orang tentang pengoptimalan mikro.
Vitim.us
27

Atribut khusus memberikan cara yang nyaman untuk membawa data tambahan ke sisi klien. Dojo Toolkit melakukan ini secara teratur dan telah ditunjukkan ( Membongkar Mitos Toolkit Dojo ) bahwa:

Atribut khusus selalu HTML yang valid, hanya saja tidak divalidasi saat diuji dengan DTD. [...] Spesifikasi HTML menyatakan bahwa atribut apa pun yang tidak dikenali harus diabaikan oleh mesin rendering HTML di agen pengguna, dan Dojo secara opsional memanfaatkan ini untuk meningkatkan kemudahan pengembangan.

Maine
sumber
9

Pilihan lainnya adalah dengan mendefinisikan sesuatu seperti ini di Javascript:

<script type="text/javascript">
var link_titles = {link1: "Title 1", link2: "Title 2"};
</script>

Kemudian Anda dapat menggunakan ini nanti di kode Javascript Anda, dengan asumsi tautan Anda memiliki ID yang sesuai dengan ID di hashtable ini.

Itu tidak memiliki kelemahan dari dua metode lainnya: tidak ada atribut non-standar atau rentang tersembunyi yang jelek.

Kerugiannya adalah bahwa ini mungkin sedikit berlebihan untuk hal-hal yang sederhana seperti contoh Anda. Tetapi untuk skenario yang lebih kompleks, di mana Anda memiliki lebih banyak data untuk diteruskan, itu adalah pilihan yang baik. Terutama mengingat datanya diteruskan sebagai JSON, jadi Anda bisa meneruskan objek yang kompleks dengan mudah.

Selain itu, Anda menjaga data tetap terpisah dari pemformatan, yang merupakan hal yang baik untuk pemeliharaan.

Anda bahkan dapat memiliki sesuatu seperti ini (yang tidak dapat Anda lakukan dengan metode lain):

var poi_types = {1: "City", 2: "Restaurant"};
var poi = {1: {lat: X, lng: Y, name: "Beijing", type: 1}, 2: {lat: A, lng: B, name: "Hatsune", type: 2}};

...

<a id="poi-2" href="/poi/2/">Hatsune</a>

Dan karena Anda kemungkinan besar menggunakan beberapa bahasa pemrograman sisi server, tabel hash ini seharusnya mudah dibuat secara dinamis (cukup buat serial ke JSON dan ludahkan di bagian header halaman).

ibz
sumber
4

Nah dalam hal ini, solusi optimal adalah

<a href="#" alt="" title="Title of My Pop-up">click</a>

dan menggunakan atribut judul.

Terkadang saya merusak spesifikasi jika saya benar-benar membutuhkannya. Tapi jarang, dan hanya untuk alasan yang bagus.

EDIT: Tidak yakin mengapa -1, tapi saya menunjukkan bahwa terkadang Anda berpikir Anda perlu merusak spesifikasi, padahal tidak.

jskulski.dll
sumber
4

Mengapa tidak mendeklarasikan atribut popup_title di DTD kustom? Ini menyelesaikan masalah dengan validasi. Saya melakukan ini dengan setiap elemen non-standar, atribut dan nilai dan terima kasih validasi ini hanya menunjukkan masalah nyata dengan kode saya. Hal ini juga mengurangi kemungkinan kesalahan browser dengan HTML tersebut.

Marquee
sumber
2

Anda bisa menyarangkan elemen masukan tersembunyi DI DALAM elemen jangkar

<a id="anchor_id">
  <input type="hidden" class="articleid" value="5">
  Link text here
</a>

Kemudian Anda dapat dengan mudah menarik data dengan

$('#anchor_id .articleid').val()
Ioan Alexandru Cucu
sumber
1
Ya, tapi cara terbaik adalah dengan menggunakan: <input type="hidden" title="article_id" value="5" />. Karena kelas adalah sesuatu untuk CSS, sebenarnya memberikan kode yang tidak valid jika kelas tersebut tidak ada dalam informasi gaya. Bahkan jika JS atau CSS dimatikan, data akan tetap tersembunyi.
Yeti
1
@Yeti, kelas bukanlah sesuatu untuk CSS atau tidak valid jika tidak muncul dalam gaya. Itu hanya data pada elemen, seperti atribut lainnya. Kaitannya dengan CSS adalah bahwa ini adalah pemilih yang didukung dengan baik.
Kelopak mata
0

Solusi saya pada akhirnya adalah menyembunyikan data tambahan di tag id yang dipisahkan oleh semacam pemisah (satu garis bawah adalah spasi, dua adalah akhir dari argumen itu), argumen kedua ada id:

<a href="#" class="article" id="Title_of_My_Pop-up__47">click</a>

Jelek, dan mengasumsikan Anda belum menggunakan tag id untuk sesuatu yang lain, tetapi itu sesuai di semua browser.

Matt Parkins
sumber
-1

Perasaan pribadi saya dalam contoh Anda adalah bahwa rute span lebih sesuai, karena memenuhi standar spesifikasi XHTML. Namun, saya dapat melihat argumen untuk atribut khusus, tetapi saya pikir mereka menambahkan tingkat kebingungan yang tidak diperlukan.

Penjual Mitchel
sumber
10
Rute SPAN adalah penyalahgunaan tag. Ini mungkin memenuhi standar validasi, tetapi tidak memenuhi standar semantik.
ceejayoz
-1

Saya telah memeras otak saya untuk ini juga. Saya suka keterbacaan atribut non-standar, tetapi saya tidak suka itu akan melanggar standar. Contoh span tersembunyi sesuai, tetapi tidak terlalu mudah dibaca. Bagaimana dengan ini:

<a href="#" alt="" title="" rel="{popup_title:'Title of My Pop-up'}">click</a>

Di sini kodenya sangat mudah dibaca, karena notasi pasangan kunci / nilai JSON. Anda dapat mengetahui bahwa ini adalah meta data yang memiliki tautan hanya dengan melihatnya. Satu-satunya kekurangan yang dapat saya lihat selain membajak atribut "rel" adalah hal ini akan membuat berantakan objek yang kompleks. Saya sangat menyukai gagasan tentang atribut awalan "data-" yang disebutkan di atas. Apakah ada browser terkini yang mendukung ini?

Berikut adalah hal lain untuk dipikirkan. Seberapa besar pengaruh tidak mematuhi kode pada SEO?


sumber
7
Atribut rel menjelaskan hubungan antara halaman saat ini dan sumber daya yang ditautkan. Ini bukan atribut umum "Simpan data apa pun yang Anda suka". Jadi ini mengerikan.
Quentin
1
Apakah ada browser terkini yang mendukung ini? - Apa yang harus didukung? Browser sudah dapat mentolerir kode yang tidak sesuai. Mengingat ini adalah bagian dari HTML5 baru, tidak ada yang perlu ditakutkan untuk menambahkan atribut data seperti Anda menambahkan atribut khusus lainnya.
Slavia