Apakah HTML5 atribut data "bekerja" di IE 6?

173

Atribut data khusus: http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data

Ketika saya mengatakan "bekerja", maksud saya, jika saya punya HTML seperti ini:

<div id="geoff" data-geoff="geoff de geoff">

akankah JavaScript berikut ini:

var geoff = document.getElementById('geoff');
alert(geoff.dataGeoff);

menghasilkan, di IE 6, peringatan dengan "geoff de geoff" di dalamnya?

Paul D. Waite
sumber
117
HTML5 dan IE6? Kengeriannya ... O_o
Vivin Paliath
7
Perhatikan bahwa data-geoffini bukan pengidentifikasi JS yang valid karena karakter "-". Anda harus menggunakan dataGeoffskrip.
outis
3
@outis: Menurut spesifikasi (dalam konsep), maksud Anda? Saya mengujinya sendiri di FF 3.6 dan Chromium 5.0.307.11 dan mengambil geoff.dataGeofftidak berhasil. Ternyata ( whatwg.org/specs/web-apps/current-work/multipage/... ) yang harus menjadi geoff.dataset.geoff, tetapi sebagai element.datasetmasih undefineddalam browser modern, yang tidak didukung.
Marcel Korpel
7
Jeffth dari jeffth, sembilan belas jeffty-jeff.
Matt Sach
2
@ ANeves: sementara itu memungkinkan seseorang untuk mengakses properti dengan karakter yang tidak dapat diidentifikasi, itu tidak berlaku di sini karena browser tidak akan menjembatani atribut HTML 'data-geoff' dengan properti dengan nama yang sama di DOM.
outis

Jawaban:

153

Anda dapat mengambil nilai atribut kustom (atau milik Anda) menggunakan getAttribute. Mengikuti contoh Anda dengan

<div id="geoff" data-geoff="geoff de geoff">

Saya bisa mendapatkan nilai data-geoffmenggunakan

var geoff = document.getElementById("geoff");
alert(geoff.getAttribute("data-geoff"));

Lihat MSDN . Dan meskipun disebutkan di sana bahwa Anda perlu IE7 untuk mendapatkan ini berfungsi, saya mengujinya beberapa saat yang lalu dengan IE6 dan berfungsi dengan benar (bahkan dalam mode kebiasaan).

Tapi ini tidak ada hubungannya dengan atribut khusus HTML5, tentu saja.

Marcel Korpel
sumber
4
Benar-benar, ini bukan dukungan sebenarnya dari atribut data HTML5. Memang terdengar seperti cara untuk memanfaatkannya.
Paul D. Waite
Benar ini tidak mendukung API data yang meletakkan sesuatu dalam koleksi atau apa pun (tidak ada yang mendukung ini ya). Namun, seperti yang ditunjukkan oleh dapatkan / Tetapkan Atribut Anda bisa mendapatkan penggunaan utama dari atribut-data segera di peramban DOM minimal yang sadar. Anda mungkin juga bisa menambal peramban monyet jika Anda cenderung membuat koleksi yang hilang. Dari percobaan buku saya baru-baru ini, jelas bahwa atribut data dapat digunakan sekarang dan jauh lebih unggul daripada skema umum saat ini yang memuat nilai atribut kelas untuk berisi info gaya dan data meta acak.
Thomas Powell
"Kamu mungkin juga bisa menambal browser jika kamu sangat ingin membuat koleksi yang hilang." - Ya, itu hal yang menyenangkan tentang JavaScript dibandingkan dengan CSS: karena ini adalah bahasa pemrograman, Anda dapat memperbaiki sendiri masalah kompatibilitas.
Paul D. Waite
Saya sebenarnya kagum dengan jawaban ini yang masih mendapat banyak pujian, terutama karena IE 6 harus dianggap "mati", menurut banyak pengembang web.
Marcel Korpel
6
@ Marscel: Saya pikir beberapa situs masih memiliki IE 6 sebagai bagian yang tidak dapat diabaikan dari audiens mereka. Mungkin di lain 10 tahun kita tidak perlu khawatir lagi.
Paul D. Waite
141

Ya, mereka bekerja.

IE telah mendukung getAttribute()dari IE4 yang digunakan jQuery secara internal data().

data = elem.getAttribute( "data-" + key ); // Line 1606, jQuery.1.5.2.js

Jadi Anda bisa menggunakan .data()metode jQuery atau JavaScript vanilla biasa:

Contoh HTML

<div id="some-data" data-name="Tom"></div>

Javascript

var el = document.getElementById("some-data");
var name = el.getAttribute("data-name");
alert(name);

jQuery

var name = $("#some-data").data("name");
Marko
sumber
2
Jawaban ini tampaknya sedikit bertentangan dengan canIuse. Adakah masukan mengapa itu ditandai sebagai "sebagian" didukung? caniuse.com/dataset
Snekse
8
@Snekse Saya percaya ini terkait dengan catatan di bagian bawahNote: All browsers can already use data-* attributes and access them using getAttribute. "Supported" refers to accessing the values using the dataset property. Current spec only refers to support on HTML elements, only some browsers also have support for SVG/MathML elements.
Marko
@ Marko Bagaimana <div lala="Tom"></div>, apakah ini ok di IE6? Bagaimana Anda membaca nilainya?
Royi Namir
@RoyiNamir Saya percaya ini akan berfungsi dengan baik dengan atribut apa pun tetapi Anda sebaiknya memeriksa. Saya tidak memiliki IE6 di mana pun.
Marko
Saya berharap jquery pergi begitu saja
SuperUberDuper
9

IE6 tidak hanya tidak mendukung fitur Atribut Data HTML5, bahkan sebenarnya tidak ada browser saat ini yang mendukungnya! Satu-satunya pengecualian saat ini adalah Chrome.

Anda bebas menggunakan data-geoff="geoff de geoff"sebagai atribut, tetapi hanya Chrome versi browser saat ini yang akan memberi Anda .dataGeoffproperti.

Untungnya, semua browser saat ini - termasuk IE6 - dapat mereferensikan atribut yang tidak diketahui menggunakan .getAttribute()metode DOM standar , sehingga .getAttribute("data-geoff")akan bekerja di mana saja.

Dalam waktu dekat, versi baru Firefox dan Safari akan mulai mendukung atribut data, tetapi mengingat bahwa ada cara yang sangat baik untuk mengaksesnya yang bekerja di semua browser, maka benar-benar tidak ada alasan untuk menggunakan metode HTML5 yang akan hanya berfungsi untuk beberapa pengunjung Anda.

Anda dapat melihat lebih lanjut tentang kondisi dukungan saat ini untuk fitur ini di CanIUse.com .

Semoga itu bisa membantu.

Spudley
sumber
1
"IE6 tidak hanya tidak mendukung fitur Atribut Data HTML5, bahkan sebenarnya tidak ada browser saat ini yang mendukung mereka" - tentu saja, meskipun itu tergantung pada definisi "dukungan" Anda. Tidak ada browser yang mendukung datasetproperti, tetapi semua browser memungkinkan Anda untuk menyimpan data dalam atribut dengan awalan data-, dan (seperti yang Anda katakan) mengambilnya melalui getAttribute. Jadi di satu sisi mereka mendukung fitur, karena Anda dapat menggunakan atribut itu sendiri secara efektif.
Paul D. Waite
Saya mengerti maksud Anda karena tidak ada alasan untuk menggunakan datasetproperti untuk mengaksesnya - saya tidak tahu manfaat apa yang ditawarkannya getAttribute.
Paul D. Waite
2
@ Paul - tidak menawarkan kelebihan dibandingkan getAttribute. Apa yang ditawarkannya adalah cara standar untuk menangani penyimpanan data terhadap tag menggunakan atribut. Ini selalu berhasil tetapi tidak pernah menjadi standar resmi hingga HTML5. HTML5 hanya mengambil fitur yang tidak standar tetapi banyak digunakan dan meratifikasinya, menambahkan beberapa aturan untuk mengatakan bagaimana Anda harus menamainya, dan mendefinisikan cara baru untuk mengaksesnya. Ketika saya mengatakan itu tidak didukung, saya secara eksplisit merujuk ke .dataXYZproperti; seperti yang Anda katakan, fungsionalitas dasar didukung secara luas, tetapi bukan karena itu HTML5.
Spudley
7

Saya pikir IE selalu mendukung ini (setidaknya mulai dari IE4) dan Anda dapat mengaksesnya dari JS. Mereka disebut 'properti diperluas'. Lihat artikel MSDN lama

Perilaku ini dapat dinonaktifkan dengan menyetel properti ekspansi ke false pada elemen DOM (itu benar secara default, sehingga properti Expando bekerja secara default).

Edit: memperbaiki URL

Timores
sumber
Ah, ya maaf, saya tidak berpikir itu yang saya maksudkan. Hanya mengedit pertanyaan untuk diklarifikasi.
Paul D. Waite
Saya orang yang minta maaf, tautannya salah. Ini menjelaskan cara menonaktifkan perilaku ini alih-alih menjelaskan fitur. Saya telah memperbaiki tautan dan teksnya.
Timores
1
getAttribute bekerja lintas-browser, tidak perlu bergantung pada kebiasaan IE di sini.
bodoh
bagus sekali, terima kasih. Artikel bagus juga, pasti cinta "Selamat datang di kolom DHTML Dude pertama."
Paul D. Waite
4

Jika Anda ingin mengambil semua atribut data khusus sekaligus seperti properti dataset di browser yang lebih baru, Anda bisa melakukan hal berikut. Inilah yang saya lakukan dan bekerja bagus untuk saya di ie7 +.

function getDataSet(node) {
    var dataset = {};
    var attrs = node.attributes;
    for (var i = 0; i < attrs.length; i++) {
        var attr = attrs.item(i);
        // make sure it is a data attribute
        if(attr.nodeName.match(new RegExp(/^data-/))) {
            // remove the 'data-' from the string 
            dataset[attr.nodeName.replace(new RegExp('^data-'), '')] = attr.nodeValue;
        }
    }
    return dataset;
}
pengguna1767210
sumber
0

Di IE6 , itu mungkin tidak berfungsi. Untuk referensi: MSDN

Saya sarankan menggunakan jQuery untuk menangani sebagian besar kasus:

var geoff = $("#geoff").data("data-geoff");
alert(geoff);

Coba ini di coding Anda.

Pengembang HTML5
sumber
Di IE6, ini berfungsi (lihat jawaban yang diterima ), dan saya tidak bertanya tentang jQuery.
Paul D. Waite
@ Paul D. Waite: Maaf, saya menolak flag spam Anda secara tidak sengaja. Ini memang terlihat mencurigakan.
BoltClock
@BoltClock: tidak apa-apa. Saran kode sebenarnya agak masuk akal, tetapi tautan pembaca berita itu jelas sama sekali tidak terkait.
Paul D. Waite
Lalu mengapa masih di sini 4 tahun kemudian?
Dan Pantry