Les attributs de données personnalisés HTML5 «fonctionnent-ils» dans IE 6?

173

Attributs de données personnalisés: http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data

Quand je dis «travail», je veux dire, si j'ai du HTML comme celui-ci:

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

sera le JavaScript suivant:

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

produire, dans IE 6, une alerte avec «geoff de geoff»?

Paul D. Waite
la source
117
HTML5 et IE6? The horror ... O_o
Vivin Paliath
7
Notez que ce data-geoffn'est pas un identifiant JS valide en raison du caractère "-". Vous auriez besoin d'utiliser dataGeoffdans les scripts.
sortie
3
@outis: Selon les spécifications (dans le brouillon), vous voulez dire? Je l'ai testé moi-même dans FF 3.6 et Chromium 5.0.307.11 et la récupération geoff.dataGeoffn'a pas fonctionné. Il s'est avéré ( whatwg.org/specs/web-apps/current-work/multipage/… ) que cela devrait être geoff.dataset.geoff, mais comme element.datasetc'est toujours le cas undefineddans les navigateurs modernes, ce n'est ni pris en charge.
Marcel Korpel
7
Le jeffth du jeffth, dix-neuf jeffty-jeff.
Matt Sach du
2
@ANeves: bien que cela permette d'accéder à une propriété avec des caractères non identifiants, cela ne s'applique pas ici car le navigateur ne reliera pas un attribut HTML 'data-geoff' avec une propriété du même nom dans le DOM.
sortie

Réponses:

153

Vous pouvez récupérer les valeurs des attributs personnalisés (ou les vôtres) à l'aide de getAttribute. Suivre votre exemple avec

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

Je peux avoir la valeur d' data-geoffutiliser

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

Voir MSDN . Et bien qu'il soit mentionné ici que vous avez besoin d'IE7 pour que cela fonctionne, je l'ai testé il y a un moment avec IE6 et cela fonctionnait correctement (même en mode bizarreries).

Mais cela n'a rien à voir avec les attributs spécifiques à HTML5, bien sûr.

Marcel Korpel
la source
4
Ce n'est pas du tout le support des attributs de données HTML5. Cela ressemble cependant à un moyen de les utiliser.
Paul D.Waite
Corrigez cela ne prend pas en charge l'API de données mettant des choses dans une collection ou autre (personne ne prend en charge ce oui). Cependant, comme le montre get / Set Attribute, vous pouvez obtenir l'utilisation principale des attributs de données immédiatement dans n'importe quel navigateur au minimum conscient du DOM. Vous pourriez probablement aussi utiliser des navigateurs de patchs singes si vous êtes si enclin à créer les collections manquantes. D'après mes récentes expériences de livres, il est clair que les attributs de données sont utilisables maintenant et sont bien supérieurs au schéma courant actuel de surcharge de la valeur d'attribut de classe pour contenir des informations de style et des métadonnées aléatoires.
Thomas Powell
"Vous pourriez probablement aussi utiliser des correctifs pour les navigateurs si vous êtes si enclin à créer les collections manquantes." - Ouais, c'est la bonne chose à propos de JavaScript par rapport à CSS: comme c'est un langage de programmation, vous pouvez résoudre vous-même les problèmes de compatibilité.
Paul D.Waite
Je suis en fait étonné que cette réponse reçoive encore autant de crédit, d'autant plus que IE 6 devrait être considéré comme "mort", selon de nombreux développeurs Web.
Marcel Korpel
6
@Marcel: Je pense que de nombreux sites ont encore IE 6 comme une partie non négligeable de leur audience. Peut-être dans un autre 10 ans , nous aurons pas à vous soucier plus.
Paul D.Waite
141

Oui, ils fonctionnent.

IE a pris en charge getAttribute()depuis IE4, ce que jQuery utilise en interne data().

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

Vous pouvez donc soit utiliser la .data()méthode de jQuery, soit du JavaScript simple:

Exemple de 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
la source
2
Cette réponse semble un peu en conflit avec canIuse. Avez-vous des informations sur les raisons pour lesquelles il est marqué comme "partiellement" pris en charge? caniuse.com/dataset
Snekse
8
@Snekse Je crois que c'est lié à la note en basNote: 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 Et <div lala="Tom"></div>, est-ce que ça irait dans IE6? Comment lisez-vous la valeur?
Royi Namir
@RoyiNamir Je pense que cela devrait fonctionner avec n'importe quel attribut, mais il vaut mieux vérifier. Je n'ai IE6 à portée de main nulle part.
Marko
Je souhaite que jquery disparaisse
SuperUberDuper
9

Non seulement IE6 ne prend pas en charge la fonction d'attribut de données HTML5, mais en fait pratiquement aucun navigateur actuel ne les prend en charge! La seule exception pour le moment est Chrome.

Vous êtes parfaitement libre d'utiliser data-geoff="geoff de geoff"comme attribut, mais seul Chrome des versions actuelles du navigateur vous donnera la .dataGeoffpropriété.

Heureusement, tous les navigateurs actuels - y compris IE6 - peuvent référencer des attributs inconnus en utilisant la .getAttribute()méthode DOM standard , donc .getAttribute("data-geoff")fonctionnera partout.

Dans un avenir très proche, les nouvelles versions de Firefox et Safari commenceront à prendre en charge les attributs de données, mais étant donné qu'il existe un moyen parfaitement efficace d'y accéder qui fonctionne dans tous les navigateurs, il n'y a vraiment aucune raison d'utiliser la méthode HTML5 qui ne fonctionnent que pour certains de vos visiteurs.

Vous pouvez en savoir plus sur l'état actuel de la prise en charge de cette fonctionnalité sur CanIUse.com .

J'espère que cela pourra aider.

Spudley
la source
1
«Non seulement IE6 ne prend pas en charge la fonction d'attribut de données HTML5, mais en fait pratiquement aucun navigateur actuel ne les prend en charge» - bien sûr, bien que cela dépende de votre définition du «support». Aucun navigateur ne prend en charge la datasetpropriété, mais tous les navigateurs vous permettent de stocker des données dans des attributs avec un préfixe de data-, et (comme vous le dites) de les récupérer via getAttribute. Donc, dans un sens, ils prennent en charge la fonctionnalité, car vous pouvez utiliser les attributs eux-mêmes efficacement.
Paul D.Waite
Je vois votre argument selon datasetlequel il n'y a aucune raison d'utiliser la propriété pour y accéder - je ne sais pas quels avantages il est censé offrir getAttribute.
Paul D.Waite
2
@Paul - il n'offre aucun avantage par rapport à getAttribute. Ce qu'il offre, c'est un moyen standardisé de gérer le stockage des données par rapport à une balise à l'aide d'attributs. Cela a toujours fonctionné mais n'a jamais été une norme officielle avant HTML5. HTML5 a simplement pris une fonctionnalité existante non standard mais largement utilisée et l'a ratifiée, en ajoutant quelques règles pour dire comment vous devez les nommer, et en définissant une nouvelle façon d'y accéder. Quand je dis que ce n'est pas pris en charge, je fais explicitement référence aux .dataXYZpropriétés; comme vous le dites, la fonctionnalité de base est largement prise en charge, mais pas parce qu'elle est HTML5.
Spudley
7

Je pense que IE a toujours soutenu cela (au moins à partir de IE4) et vous pouvez y accéder à partir de JS. Ils étaient appelés «propriétés expansibles». Voir l' ancien article MSDN

Ce comportement peut être désactivé en définissant la propriété expando sur false sur un élément DOM (c'est vrai par défaut, donc les propriétés expando fonctionnent par défaut).

Edit: correction de l'URL

Timores
la source
Ah, oui désolé, je ne pense pas que ce soit le sens que je voulais. Je viens de modifier la question pour clarifier.
Paul D.Waite
C'est moi qui suis désolé, le lien était faux. Il a expliqué comment désactiver ce comportement au lieu d'expliquer la fonctionnalité. J'ai corrigé le lien et le texte.
Timores
1
getAttribute fonctionne avec plusieurs navigateurs, pas besoin de se fier aux bizarreries d'IE ici.
foolip
excellent merci. Bel article aussi, je dois adorer "Bienvenue dans la première colonne DHTML Dude."
Paul D.Waite
4

Si vous souhaitez récupérer tous les attributs de données personnalisés à la fois, comme la propriété de l'ensemble de données dans les navigateurs plus récents, vous pouvez effectuer les opérations suivantes. C'est ce que j'ai fait et fonctionne très bien pour moi dans 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;
}
user1767210
la source
0

Dans IE6 , cela peut ne pas fonctionner. Pour référence: MSDN

Je suggère d'utiliser jQuery pour gérer la plupart des cas:

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

Essayez ceci dans votre codage.

Développeur HTML5
la source
Dans IE6, cela fonctionne (voir la réponse acceptée ), et je n'ai pas posé de questions sur jQuery.
Paul D.Waite
@Paul D. Waite: Désolé, j'ai refusé votre signalement de spam par erreur. Cela semble suspect.
BoltClock
@BoltClock: c'est très bien. La suggestion de code est en fait quelque peu raisonnable, mais ce lien de lecteur de nouvelles est évidemment totalement indépendant.
Paul D.Waite
Alors pourquoi est-il toujours là 4 ans plus tard?
Dan Pantry