Gli attributi di dati personalizzati HTML5 "funzionano" in IE 6?


173

Attributi di dati personalizzati: http://dev.w3.org/html5/spec/Overview.html#embedding-custom-non-visible-data

Quando dico "lavoro", intendo, se ho HTML in questo modo:

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

sarà il seguente JavaScript:

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

produrre, in IE 6, un avviso con "geoff de geoff" in esso?


117
HTML5 e IE6? L'orrore ... O_o
Vivin Paliath

7
Nota che data-geoffnon è un identificatore JS valido a causa del carattere "-". Dovresti usare dataGeoffnegli script.
uscita

3
@outis: Secondo le specifiche (in bozza), vuoi dire? L'ho provato io stesso in FF 3.6 e Chromium 5.0.307.11 e il recupero geoff.dataGeoffnon ha funzionato. Si è scoperto ( whatwg.org/specs/web-apps/current-work/multipage/… ) che dovrebbe essere geoff.dataset.geoff, ma come element.datasetè ancora undefinednei browser moderni, questo non è supportato.
Marcel Korpel,

7
Il jeffth del jeffth, diciannove jeffty-jeff.
Matt Sach,

2
@ANeves: sebbene ciò consenta di accedere a una proprietà con caratteri non identificativi, qui non si applica in quanto il browser non collegherà un attributo HTML "data-geoff" con una proprietà con lo stesso nome nel DOM.
uscita

Risposte:


153

Puoi recuperare i valori degli attributi personalizzati (o tuoi) usando getAttribute. Seguendo il tuo esempio con

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

Posso ottenere il valore di data-geoffutilizzo

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

Vedi MSDN . E anche se è stato menzionato lì che hai bisogno di IE7 per farlo funzionare, l'ho provato qualche tempo fa con IE6 e ha funzionato correttamente (anche in modalità strane).

Ma questo non ha nulla a che fare con gli attributi specifici di HTML5, ovviamente.


4
Totalmente, questo non è il supporto effettivo degli attributi di dati HTML5. Sembra un modo per usarli però.
Paul D. Waite,

Corretto questo non supporta l'API dei dati che inseriscono oggetti in una raccolta o altro (nessuno supporta questo sì). Tuttavia, come mostrato da get / Set Attribute, è possibile ottenere immediatamente l'uso principale degli attributi dei dati in qualsiasi browser minimamente compatibile con DOM. Probabilmente potresti anche scansionare i browser delle patch se sei così incline a creare le raccolte mancanti. Dai miei recenti esperimenti sui libri è chiaro che gli attributi dei dati sono utilizzabili ora e sono di gran lunga superiori all'attuale schema comune di sovraccarico del valore dell'attributo di classe per contenere informazioni di stile e metadati casuali.
Thomas Powell,

"Probabilmente potresti anche scansionare i browser delle patch se sei così incline a creare le raccolte mancanti." - Sì, questa è la cosa bella di JavaScript rispetto ai CSS: poiché è un linguaggio di programmazione, puoi risolvere tu stesso i problemi di compatibilità.
Paul D. Waite,

Sono davvero sorpreso che questa risposta ottenga ancora così tanto credito, soprattutto perché IE 6 dovrebbe essere considerato "morto", secondo molti sviluppatori web.
Marcel Korpel,

6
@Marcel: penso che alcuni siti abbiano ancora IE 6 come parte non trascurabile del loro pubblico. Forse tra altri 10 anni non dovremo più preoccuparci.
Paul D. Waite,

141

Sì, funzionano.

IE ha supportato getAttribute()da IE4 che è ciò che jQuery utilizza internamente data().

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

Quindi puoi usare il .data()metodo di jQuery o JavaScript semplice alla vaniglia:

HTML di esempio

<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
Questa risposta sembra essere leggermente in conflitto con canIuse. Qualche input sul perché è contrassegnato come "parzialmente" supportato? caniuse.com/dataset
Snekse,

8
@Snekse Credo che sia legato alla nota in fondoNote: 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 Che dire <div lala="Tom"></div>, sarebbe ok in IE6? Come leggeresti il ​​valore?
Royi Namir,

@RoyiNamir Credo che dovrebbe funzionare bene con qualsiasi attributo ma è meglio verificare. Non ho IE6 a portata di mano da nessuna parte.
Marko,

Vorrei che jquery se ne andasse via
SuperUberDuper l'

9

Non solo IE6 non supporta la funzione di attributo dei dati HTML5, in realtà praticamente nessun browser attuale li supporta! L'unica eccezione al momento è Chrome.

Sei perfettamente libero di usare data-geoff="geoff de geoff"come attributo, ma solo Chrome delle versioni correnti del browser ti darà la .dataGeoffproprietà.

Fortunatamente, tutti i browser attuali, incluso IE6, possono fare riferimento ad attributi sconosciuti usando il .getAttribute()metodo DOM standard , quindi .getAttribute("data-geoff")funzioneranno ovunque.

In un futuro molto prossimo, le nuove versioni di Firefox e Safari inizieranno a supportare gli attributi dei dati, ma dato che esiste un modo perfettamente valido di accedervi che funziona in tutti i browser, non c'è davvero alcun motivo per utilizzare il metodo HTML5 che funziona solo per alcuni dei tuoi visitatori.

Puoi vedere di più sullo stato attuale del supporto per questa funzione su CanIUse.com .

Spero che aiuti.


1
"Non solo IE6 non supporta la funzione di attributo dei dati HTML5, in realtà praticamente nessun browser corrente li supporta" - certo, anche se ciò dipende dalla definizione di "supporto". Nessun browser supporta la datasetproprietà, ma tutti i browser consentono di archiviare i dati negli attributi con un prefisso data-e (come dici tu) di recuperarli tramite getAttribute. Quindi, in un certo senso, supportano la funzione, perché è possibile utilizzare gli attributi stessi in modo efficace.
Paul D. Waite,

Vedo il tuo punto sul fatto che non vi è alcun motivo per utilizzare la datasetproprietà per accedervi però - non so quali vantaggi dovrebbe offrire getAttribute.
Paul D. Waite,

2
@Paul - non offre alcun vantaggio rispetto a getAttribute. Ciò che offre è un modo standardizzato per gestire la memorizzazione dei dati su un tag utilizzando gli attributi. Questo ha sempre funzionato, ma non è mai stato uno standard ufficiale fino a HTML5. HTML5 ha semplicemente adottato una funzionalità non standard ma ampiamente utilizzata e l'ha ratificata, aggiungendo alcune regole per dire come si dovrebbero nominare e definendo un nuovo modo per accedervi. Quando dico che non è supportato, mi riferisco esplicitamente alle .dataXYZproprietà; come dici tu, la funzionalità di base è ampiamente supportata, ma non perché è HTML5.
Spudley,

7

Penso che IE abbia sempre supportato questo (almeno a partire da IE4) e puoi accedervi da JS. Erano chiamati "proprietà expando". Vedi il vecchio articolo MSDN

Questo comportamento può essere disabilitato impostando la proprietà expando su false su un elemento DOM (è vero per impostazione predefinita, quindi le proprietà di expando funzionano per impostazione predefinita).

Modifica: risolto l'URL


Ah, sì scusa, non credo sia questo il senso che intendevo. Ho appena modificato la domanda per chiarire.
Paul D. Waite,

Mi dispiace, il link era sbagliato. Ha spiegato come disabilitare questo comportamento invece di spiegare la funzionalità. Ho corretto il link e il testo.
Timores,

1
getAttribute funziona su più browser, non è necessario fare affidamento sulle stranezze di IE qui.
sciocco

eccellente grazie. Anche un bell'articolo, devo amare "Benvenuti nella prima colonna DHTML Dude".
Paul D. Waite,

4

Se si desidera recuperare tutti gli attributi di dati personalizzati contemporaneamente come la proprietà del set di dati nei browser più recenti, è possibile effettuare le seguenti operazioni. Questo è quello che ho fatto e funziona benissimo per me in 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;
}

0

In IE6 , potrebbe non funzionare. Per riferimento: MSDN

Suggerisco di usare jQuery per gestire la maggior parte dei casi:

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

Prova questo nella tua codifica.


In IE6 funziona (vedi la risposta accettata ) e non ho chiesto informazioni su jQuery.
Paul D. Waite,

@Paul D. Waite: Scusa, ho rifiutato la tua bandiera spam per errore. Questo sembra sospetto.
BoltClock

@BoltClock: va bene. Il suggerimento sul codice è in realtà un po 'ragionevole, ma il collegamento del lettore di notizie è ovviamente del tutto indipendente.
Paul D. Waite,

Allora perché è ancora qui 4 anni dopo?
Dan Pantry,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.