HTML5 özel veri özellikleri IE 6'da “çalışıyor” mu?


173

Özel veri özellikleri: http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data

“İş” dediğimde, şöyle bir HTML varsa:

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

aşağıdaki JavaScript'i kullanır:

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

IE 6, içinde "geoff de geoff" ile bir uyarı üretmek?


117
HTML5 ve IE6? Korku ... O_o
Vivin Paliath

7
Bunun data-geoff"-" karakteri nedeniyle geçerli bir JS tanımlayıcısı olmadığını unutmayın . dataGeoffKomut dosyalarında kullanmanız gerekir .
outis

3
@outis: Spesifikasyonlara göre (taslak halinde), yani? Bunu kendim FF 3.6 ve Chromium 5.0.307.11'de test ettim ve geri alma geoff.dataGeoffişe yaramadı. O (çıktı whatwg.org/specs/web-apps/current-work/multipage/... o) gerektiğini olmak geoff.dataset.geoff, ancak element.datasethala undefinedne desteklendiğini modern tarayıcılarda, içinde.
Marcel Korpel

7
Jeffth'in jeffth'i, ondokuz jeffty-jeff.
Matt Sach

2
@ANeves: bu, tanımlayıcı olmayan karakterlere sahip bir özelliğe erişmenize izin verirken, tarayıcı DOM'da aynı adda bir özelliğe sahip bir 'data-geoff' HTML özniteliği arasında köprü oluşturmayacağı için burada geçerli değildir.
outis

Yanıtlar:


153

Tuşlarını kullanarak özel (veya kendi) öznitelik değerlerinizi alabilirsiniz getAttribute. İle örneğinizin ardından

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

data-geoffKullanmanın değerini alabilirim

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

Bkz. MSDN . Ve bu işe almak için IE7 gerekir belirtilmiş olmasına rağmen, bunu bir süre önce IE6 ile test ettim ve doğru çalışıyordu (hatta tuhaflık modunda).

Ancak bunun HTML5'e özgü özelliklerle hiçbir ilgisi yok elbette.


4
Tamamen, bu HTML5 veri özelliklerinin gerçek desteği değildir. Bunları kullanmak için bir yol gibi geliyor.
Paul D.Waite

Bunu düzeltmek, bir koleksiyona veya her şeye bir şeyler koyarak veri API'sını desteklemez (kimse bunu evet desteklemez). Bununla birlikte, get / Set Attribute (Get / Set Attribute) tarafından gösterildiği gibi, veri özniteliklerinin ana kullanımını en az DOM farkında tarayıcıda hemen alabilirsiniz. Eksik koleksiyonları yapmaya çok meyilliyseniz, muhtemelen maymun yama tarayıcıları da yapabilirsiniz. Son kitap deneylerimden, veri özniteliklerinin şimdi kullanılabilir olduğu ve stil bilgisi ve rastgele meta veriler içerecek şekilde sınıf öznitelik değerinin aşırı yüklenmesinin mevcut ortak şemasından çok daha üstün olduğu açıktır.
Thomas Powell

“Eksik koleksiyonları yapmaya eğilimliyseniz, muhtemelen yama tarayıcılarını da kullanabilirsiniz.” - Evet, CSS ile karşılaştırıldığında JavaScript ile ilgili güzel bir şey: çünkü bir programlama dili, uyumluluk sorunlarını kendiniz çözebilirsiniz.
Paul D.Waite

Aslında birçok web geliştiricisine göre, özellikle IE 6 "ölü" olarak kabul edilmelidir, bu cevap hala çok kredi alır hayran.
Marcel Korpel

6
@Marcel: Bence çok az sayıda site hala kitlesinin ihmal edilemez bir parçası olarak IE 6'ya sahip. Belki de başka 10 yıl biz artık endişelenmenize gerek olmayacaktır.
Paul D.Waite

141

Evet, çalışıyorlar.

IE, getAttribute()jQuery'nin dahili olarak kullandığı IE4'ü destekledi data().

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

Böylece jQuery'nin .data()yöntemini veya düz vanilya JavaScript'ini kullanabilirsiniz:

Örnek 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");

2
Bu cevap canIuse ile biraz çelişiyor gibi görünüyor. Neden "kısmen" desteklendi olarak işaretlenmiş herhangi bir girdi var mı? caniuse.com/dataset
Snekse

8
@Snekse En alttaki notla ilgili olduğuna inanıyorumNote: 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 IE6'da <div lala="Tom"></div>bu iyi olur mu? Değeri nasıl okursunuz?
Royi Namir

@RoyiNamir Ben herhangi bir öznitelik ile Tamam çalışması gerektiğini düşünüyorum ama en iyi kontrol. IE6 hiçbir yerde kullanışlı değil.
Marko

Keşke jquery sadece gitmek istiyorum
SuperUberDuper

9

IE6 sadece HTML5 Veri Özniteliği özelliğini desteklemekle kalmaz, aslında mevcut tarayıcıların neredeyse hiçbirini desteklemez! Şu anda tek istisna Chrome.

data-geoff="geoff de geoff"Özellik olarak kullanmak için tamamen özgürsünüz , ancak özelliği yalnızca geçerli tarayıcı sürümlerinin Chrome'u size verecektir .dataGeoff.

Neyse ki, tüm mevcut tarayıcılar - IE6 dahil - standart DOM .getAttribute()yöntemini kullanarak bilinmeyen özelliklere başvurabilir , bu nedenle .getAttribute("data-geoff")her yerde çalışır.

Çok yakın bir gelecekte, Firefox ve Safari'nin yeni sürümleri veri özelliklerini desteklemeye başlayacak, ancak tüm tarayıcılarda çalışan mükemmel bir erişim yolu olduğu göz önüne alındığında, HTML5 yöntemini kullanmanın gerçekten bir nedeni yoktur. yalnızca bazı ziyaretçileriniz için çalışır.

CanIUse.com adresinde bu özelliğin mevcut destek durumu hakkında daha fazla bilgi bulabilirsiniz .

Umarım yardımcı olur.


1
"IE6 sadece HTML5 Veri Özniteliği özelliğini desteklemekle kalmaz, aslında şu anda hiçbir tarayıcı onları desteklemez" - tabii ki, "destek" tanımınıza bağlıdır. Hiçbir tarayıcı datasetözelliği desteklemez , ancak tüm tarayıcılar verileri ön ekiyle özniteliklerde depolamanıza data-ve (dediğiniz gibi) aracılığıyla almanıza izin verir getAttribute. Yani bir anlamda özelliği destekliyorlar, çünkü öznitelikleri etkili bir şekilde kullanabilirsiniz.
Paul D.Waite

Ben datasetolsa onlara erişmek için özelliği kullanmak için hiçbir neden olduğunu hakkında görüşünü görüyorum - Ben sunması gereken ne faydaları bilmiyorum getAttribute.
Paul D.Waite

2
@Paul - getAttribute'a göre herhangi bir avantaj sunmaz. Sundukları, nitelikleri kullanarak bir etikete veri depolamanın standart bir yoludur. Bu her zaman işe yaradı, ancak HTML5'e kadar asla resmi bir standart değildi. HTML5, standart olmayan ancak yaygın olarak kullanılan bir özelliği aldı ve onayladı, nasıl adlandırmanız gerektiğini belirtmek için bazı kurallar ekledi ve bunlara erişmek için yeni bir yol tanımladı. Desteklenmediğini söylediğimde, açıkça .dataXYZözelliklere atıfta bulunuyorum ; Dediğiniz gibi, temel işlevler yaygın olarak desteklenir, ancak HTML5 olduğu için desteklenmez.
Spudley

7

Ben IE her zaman (en azından IE4 başlayarak) destekledi ve onlara JS erişebilirsiniz düşünüyorum. Onlara 'genişleme özellikleri' deniyordu. Bkz eski MSDN makalesine

Bu davranış, DOM öğesinde expando özelliği false olarak ayarlanarak devre dışı bırakılabilir (varsayılan olarak doğrudur, bu nedenle expando özellikleri varsayılan olarak çalışır).

Düzenle: URL düzeltildi


Ah, evet özür dilerim, niyetimin bu olduğunu düşünmüyorum. Soruyu açıklığa kavuşturmak için yeni düzenledim.
Paul D.Waite

Üzgün ​​olan benim, bağlantı yanlıştı. Özelliği açıklamak yerine bu davranışın nasıl devre dışı bırakılacağını açıkladı. Bağlantı ve metni düzelttim.
Timores

1
getAttribute çapraz tarayıcı çalışır, burada IE tuhaflıklarına güvenmeye gerek yok.
foolip

harika teşekürler. Güzel makale de, “İlk DHTML Dostum sütununa hoş geldiniz” lazım.
Paul D.Waite 10'10

4

Daha yeni tarayıcılardaki veri kümesi özelliği gibi tüm özel veri özelliklerini bir kerede almak istiyorsanız, aşağıdakileri yapabilirsiniz. Yaptığım bu ve ie7 + benim için harika çalışıyor.

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

0

In IE6 , bu çalışmayabilir. Referans için: MSDN

Ben çoğu durumda işlemek için jQuery kullanmanızı öneririz:

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

Kodunuzda bunu deneyin.


IE6, işe yarıyor ( kabul edilen cevaba bakınız ) ve jQuery hakkında sormadım.
Paul

@Paul D. Waite: Üzgünüm, yanlışlıkla spam bayrağını reddettim. Bu şüpheli görünüyor.
BoltClock

@BoltClock: Bu oldukça iyi. Kod önerisi aslında biraz makul, ancak bu haber okuyucu bağlantısı açıkça ilgisiz.
Paul

Öyleyse neden hala 4 yıl sonra burada?
Dan Pantry
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.