¿Los atributos de datos personalizados HTML5 "funcionan" en IE 6?

173

Atributos de datos personalizados: http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data

Cuando digo "trabajo", quiero decir, si tengo HTML como este:

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

será el siguiente JavaScript:

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

producir, en IE 6, una alerta con "geoff de geoff" en el?

Paul D. Waite
fuente
117
HTML5 e IE6? El horror ... O_o
Vivin Paliath
77
Tenga en cuenta que data-geoffno es un identificador JS válido debido al carácter "-". Tendrías que usarlo dataGeoffen scripts.
outis
3
@outis: ¿De acuerdo con las especificaciones (en borrador), quieres decir? Probé esto yo mismo en FF 3.6 y Chromium 5.0.307.11 y la recuperación geoff.dataGeoffno funcionó. Resultó ( whatwg.org/specs/web-apps/current-work/multipage/… ) que debería ser geoff.dataset.geoff, pero como element.datasettodavía está undefineden los navegadores modernos, eso no es compatible.
Marcel Korpel
77
El jeffth del jeffth, diecinueve jeffty-jeff.
Matt Sach
2
@ANeves: si bien eso permite acceder a una propiedad con caracteres no identificadores, no se aplica aquí ya que el navegador no unirá un atributo HTML 'data-geoff' con una propiedad del mismo nombre en el DOM.
outis

Respuestas:

153

Puede recuperar valores de atributos personalizados (o los suyos propios) utilizando getAttribute. Siguiendo tu ejemplo con

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

Puedo obtener el valor de data-geoffusar

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

Ver MSDN . Y aunque se menciona allí que necesita IE7 para que esto funcione, lo probé hace un tiempo con IE6 y funcionó correctamente (incluso en modo peculiar).

Pero esto no tiene nada que ver con los atributos específicos de HTML5, por supuesto.

Marcel Korpel
fuente
44
Totalmente, esto no es soporte real de atributos de datos HTML5. Sin embargo, parece una forma de utilizarlos.
Paul D. Waite
Correcto, esto no es compatible con la API de datos que ponen cosas en una colección o lo que sea (nadie lo admite, sí). Sin embargo, como se muestra en get / Set Attribute, puede obtener el uso principal de los atributos de datos inmediatamente en cualquier navegador mínimamente compatible con DOM. Probablemente también podría usar monitores de parches si está dispuesto a hacer las colecciones que faltan. De mis recientes experimentos en libros, está claro que los atributos de datos son utilizables ahora y son muy superiores al esquema común actual de sobrecargar el valor del atributo de clase para contener información de estilo y metadatos aleatorios.
Thomas Powell
"Probablemente también podría hacer un parche de los navegadores de parches si está dispuesto a hacer las colecciones que faltan". - Sí, eso es lo bueno de JavaScript en comparación con CSS: como es un lenguaje de programación, puede solucionar los problemas de compatibilidad usted mismo.
Paul D. Waite
De hecho, estoy sorprendido de que esta respuesta todavía reciba tanto crédito, especialmente porque IE 6 debería considerarse "muerto", según muchos desarrolladores web.
Marcel Korpel
66
@Marcel: Creo que algunos sitios todavía tienen IE 6 como una parte no despreciable de su audiencia. Tal vez en otros 10 años no tengamos que preocuparnos más.
Paul D. Waite
141

Si, ellos trabajan.

IE es compatible getAttribute()con IE4, que es para lo que jQuery utiliza internamente data().

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

Entonces puede usar el .data()método de jQuery o JavaScript simple:

HTML de muestra

<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
fuente
2
Esta respuesta parece estar un poco en conflicto con canIuse. ¿Alguna entrada sobre por qué está marcada como "parcialmente" compatible? caniuse.com/dataset
Snekse
8
@Snekse Creo que está relacionado con la nota en la parte inferiorNote: 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 ¿Qué <div lala="Tom"></div>tal si esto estaría bien en IE6? ¿Cómo leerías el valor?
Royi Namir
@RoyiNamir Creo que debería funcionar bien con cualquier atributo, pero es mejor que lo verifique. No tengo IE6 a mano en ningún lado.
Marko
Desearía que jquery simplemente desapareciera
SuperUberDuper
9

IE6 no solo no es compatible con la función de atributo de datos HTML5, sino que prácticamente no navegador actual los admite! La única excepción en este momento es Chrome.

Puede utilizarlo data-geoff="geoff de geoff"como un atributo, pero solo Chrome de las versiones actuales del navegador le dará el.dataGeoff propiedad.

Afortunadamente, todos los navegadores actuales, incluido IE6, pueden hacer referencia a atributos desconocidos utilizando el .getAttribute()método DOM estándar , por lo que.getAttribute("data-geoff") lo que funcionarán en todas partes.

En un futuro muy cercano, las nuevas versiones de Firefox y Safari comenzarán a admitir los atributos de datos, pero dado que hay una forma perfectamente buena de acceder a ella que funciona en todos los navegadores, entonces no hay realmente ninguna razón para usar el método HTML5 que solo funciona para algunos de tus visitantes.

Puede ver más sobre el estado actual de soporte para esta función en CanIUse.com .

Espero que ayude.

Spudley
fuente
1
"IE6 no solo no es compatible con la función de atributo de datos HTML5, de hecho, prácticamente ningún navegador actual los admite", claro, aunque eso depende de su definición de "soporte". Ningún navegador admite la datasetpropiedad, pero todos los navegadores le permiten almacenar datos en atributos con un prefijo de data-, y (como usted dice) recuperarlos a través de getAttribute. Entonces, en cierto sentido, admiten la función, porque puedes usar los atributos de manera efectiva.
Paul D. Waite
Sin embargo, veo su punto de vista sobre que no hay razón para usar la datasetpropiedad para acceder a ellos: no sé qué beneficios se supone que debe ofrecer getAttribute.
Paul D. Waite
2
@Paul: no ofrece ninguna ventaja sobre getAttribute. Lo que ofrece es una forma estandarizada de manejar el almacenamiento de datos contra una etiqueta usando atributos. Esto siempre ha funcionado, pero nunca fue un estándar oficial hasta HTML5. HTML5 simplemente tomó una característica existente no estándar pero ampliamente utilizada y la ratificó, agregando algunas reglas para decir cómo debe nombrarlas y definiendo una nueva forma de acceder a ellas. Cuando digo que no es compatible, me refiero explícitamente a las .dataXYZpropiedades; Como usted dice, la funcionalidad básica es ampliamente compatible, pero no porque sea HTML5.
Spudley
7

Creo que IE siempre ha admitido esto (al menos a partir de IE4) y puede acceder a ellos desde JS. Se llamaron 'propiedades de expansión'. Ver artículo antiguo de MSDN

Este comportamiento se puede deshabilitar estableciendo la propiedad expando en falso en un elemento DOM (es cierto de forma predeterminada, por lo que las propiedades expando funcionan de manera predeterminada).

Editar: reparó la URL

Timores
fuente
Ah, sí, lo siento, no creo que ese sea el sentido que pretendía. Acabo de editar la pregunta para aclarar.
Paul D. Waite
Yo soy el que lo lamenta, el enlace estaba mal. Explicó cómo deshabilitar este comportamiento en lugar de explicar la función. He arreglado el enlace y el texto.
Timores
1
getAttribute funciona entre navegadores, no es necesario confiar en las peculiaridades de IE aquí.
tonto
excelente gracias. Buen artículo también, me encanta "Bienvenido a la primera columna DHTML Dude".
Paul D. Waite
4

Si desea recuperar todos los atributos de datos personalizados a la vez, como la propiedad del conjunto de datos en los navegadores más nuevos, puede hacer lo siguiente. Esto es lo que hice y funciona muy bien para mí en 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;
}
usuario1767210
fuente
0

En IE6 , puede que no funcione. Para referencia: MSDN

Sugiero usar jQuery para manejar la mayoría de los casos:

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

Prueba esto en tu codificación.

Desarrollador HTML5
fuente
En IE6, funciona (vea la respuesta aceptada ), y no pregunté sobre jQuery.
Paul D. Waite
@Paul D. Waite: Lo siento, rechacé su bandera de spam por error. Esto parece sospechoso.
BoltClock
@BoltClock: está bastante bien. La sugerencia de código es en realidad algo razonable, pero el enlace del lector de noticias obviamente no tiene ninguna relación.
Paul D. Waite
Entonces, ¿por qué sigue aquí 4 años después?
Dan Pantry