Posso aggiungere un attributo personalizzato a un tag HTML?


348

Posso aggiungere un attributo personalizzato a un tag HTML come il seguente?

<tag myAttri="myVal" />




Sebbene le risposte dicano "sì", assicurati di disporre di un set di attributi a tema che probabilmente non verranno utilizzati con i plug-in. ad es. "data-myuniqueattribute". Di solito ho semplicemente prefisso qualsiasi cosa dopo "dati-" con un tipo di abbreviazione di due lettere. ad es. "data-yscolumntype". Mantienilo unico.

Risposte:


189

Puoi modificare la tua dichiarazione! DOCTYPE (es. DTD) per consentirla, in modo che il documento [XML] sia ancora valido:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
[
  <!ATTLIST tag myAttri CDATA #IMPLIED>
]>

#IMPLIEDsignifica che è un attributo facoltativo, oppure potresti usare #REQUIRED, ecc.

Ulteriori informazioni sono disponibili in DTD - Attributi .


2
metti tutto questo in cima al tuo file html (supponendo che la transizione xhtml 1.0 sia ok)
— carillonator

8
Forse mi manca qualcosa, ma se segui questo approccio, il simbolo]> appare nella pagina web renderizzata. Mi sta succedendo su Firefox 3.6. Questo frammento di alistapart.com/articles/customdtd sembra verificare questo comportamento: "Se scarichi i file di esempio per questo articolo e convalidi il file internal.html, puoi vederlo da solo. Sfortunatamente, quando visualizzi il file in un browser , lo]> appare sullo schermo. Non c'è modo di aggirare questo bug, quindi questo approccio è subito chiaro. "
— Mike,

3
Un paio di cose che potrebbero aiutare con le apparenze "]>": salva il file con l'estensione .xhtml. Includi il tipo MIME nel file con <meta http-equiv="content-type" content="application/xhtml+xml" />.
— LS

4
Dichiarare l'attributo è inutile per quanto riguarda il comportamento del browser. Non leggono il DTD. Inoltre, non possono nemmeno saltare correttamente il sottoinsieme interno (che viene utilizzato qui), il che spiega le misure "]>". La dichiarazione sarebbe rilevante solo per la convalida formale e non dovrebbe essere utilizzata nelle pagine di produzione.
— Jukka K. Korpela,

32
Questa risposta si applica solo a XHTML e HTML 4.01 e precedenti. Manca del tutto che ora puoi creare i tuoi attributi se li aggiungi come prefisso data-.
— brentonstrine,

299

Puoi aggiungere attributi personalizzati ai tuoi elementi a piacimento. Ma ciò renderà il tuo documento non valido.

In HTML 5 avrai la possibilità di utilizzare attributi di dati personalizzati con prefissodata- .


169
Ricorda che "non valido" non significa nulla. Il rendering della pagina andrà bene il 100% delle volte.
— John Farrell,

22
In realtà "invalido" ha implicazioni nel mondo reale. Ad esempio, può mettere il tuo documento nel rendering in modalità quirks. In ogni caso, usa il doctype HTML5 e sarai valido.
— brentonstrine,

C'è una buona tabella di diversi tipi di documenti e corrispondenti modalità del browser qui: hsivonen.fi/doctype/#handling . HTML5 doctype commuta tutti i browser post-2001 in modalità (completa) standard. I doctype XHTML Transitional e HTML 4 Transitional (specialmente senza DTD) non lo fanno :)
— Ilya Streltsyn,

santo dolce cristo, grazie. @jfar giusto ma diminuisce la leggibilità.
— Mai più il

Il mio documento non è valido in ogni caso, perché mi dice che |non è consentito in un CSS href, ma questo è ciò che è necessario per Google Fonts
— Post Self

73

No, questo interromperà la convalida.

In HTML 5 puoi / sarai in grado di aggiungere attributi personalizzati. Qualcosa come questo:

<tag data-myAttri="myVal" />

8
ma, non mi interessa la convalida, voglio solo che sia possibile accedervi tramite javascript.
— lovepring

10
Funzionerà ovviamente. Ma creare deliberatamente documenti non validi non è una buona idea.

31
La creazione di documenti non validi è un'ottima idea. Google li crea per ridurre i tempi di caricamento, ogni sito che utilizza canvas li utilizza per creare una migliore esperienza utente e l'utilizzo di framework javascript per estrarre dati significativi dagli elementi HTML è molto più semplice utilizzando la tecnica degli attributi personalizzati.
— John Farrell,

3
@jfar: Canvas non è valido. Non è in HTML 4.01; tuttavia, è una parte perfettamente legale della prossima specifica HTML5.
— Bcat,

3
Cosa intendi con "non invalido"? Non fa parte di alcuna specifica accettata. Come può qualcosa essere valido contro una specifica che non esiste?
— John Farrell,



11

Sì, è possibile, l'avete fatto nella domanda stessa: <html myAttri="myVal"/>.


2
Dipende da ciò che definisci HTML come. Penso all'HTML come a un linguaggio basato su SGML, con un insieme specifico di elementi e attributi. XHTML è una variante di XML, con un insieme specifico di elementi e attributi che assomigliano molto all'HTML. Quando usi i tuoi attributi, è ancora SGML di XML, ma secondo me non è più HTML di XHTML.
— Douwe Maan,

Prendilo come un'estensione ad hoc, non uno standard in senso stretto, ma una sorta di implementazione del requisito che non dovrebbe fallire nell'analisi se contiene attributi personalizzati.
— Luvieere,

2
DouweM: Certo, c'è sempre la serializzazione HTML di HTML5, che non è né SGML né XML.
— Bcat,

2
E hai rotto (invalidato) il documento nel processo. Non è una buona pratica.
— carillonatore

10

var demo = document.getElementById("demo")
console.log(demo.dataset.myvar)
// or
alert(demo.dataset.myvar)
//this will show in console the value of myvar
<div id="demo" data-myvar="foo">anything</div>


2
Aggiungi una breve spiegazione alla tua risposta.
— Nikolay Mihaylov,

10

Si, puoi farlo!

Avere il prossimo HTMLtag:

<tag key="value"/>

Possiamo accedere ai loro attributi con JavaScript:

element.getAttribute('key'); // Getter
element.setAttribute('key', 'value'); // Setter

Element.setAttribute()metti l'attributo nel HTMLtag se non esiste. Quindi, non è necessario dichiararlo nel HTMLcodice se si intende impostarlo JavaScript.

key: potrebbe essere qualsiasi nome desideri per l'attributo, mentre non è già utilizzato per il tag corrente. value: è sempre una stringa contenente ciò di cui hai bisogno.


7

Puoi impostare le proprietà da JavaScript.

document.getElementById("foo").myAttri = "myVal"

4

Ecco l'esempio:

document.getElementsByTagName("html").foo="bar"

Ecco un altro esempio su come impostare attributi personalizzati nell'elemento tag body:

document.getElementsByTagName('body')[0].dataset.attr1 = "foo";
document.getElementsByTagName('body')[0].dataset.attr2 = "bar";

Quindi leggi l'attributo di:

attr1 = document.getElementsByTagName('body')[0].dataset.attr1
attr2 = document.getElementsByTagName('body')[0].dataset.attr2

Puoi testare il codice sopra nella console in DevTools, ad es

JS Console, DevTools in Chrome



0

Un altro approccio, che è pulito e manterrà il documento valido, è quello di concatenare i dati desiderati in un altro tag, ad esempio id, quindi utilizzare la divisione per prendere ciò che si desidera quando lo si desidera.

<html>
<script>
  function demonstrate(){
    var x = document.getElementById("example data").querySelectorAll("input");
    console.log(x);
    for(i=0;i<x.length;i++){
      var line_to_illustrate = x[i].id  + ":" + document.getElementById ( x[i].id ).value;
      //concatenated values
      console.log("this is all together: " + line_to_illustrate); 
      //split values
      var split_line_to_illustrate = line_to_illustrate.split(":");
      for(j=0;j<split_line_to_illustrate.length;j++){
        console.log("item " + j+ " is: " + split_line_to_illustrate[j]);
      }      
    }
  }
</script> 

<body>

<div id="example data">
  <!-- consider the id values representing a 'from-to' relationship -->
  <input id="1:2" type="number" name="quantity" min="0" max="9" value="2">
  <input id="1:4" type="number" name="quantity" min="0" max="9" value="1">
  <input id="3:6" type="number" name="quantity" min="0" max="9" value="5">  
</div>

<input type="button" name="" id="?" value="show me" onclick="demonstrate()"/>

</body>
</html>

0

Puoi aggiungere, ma poi devi scrivere anche una riga di codice JavaScript,

document.createElement('tag');

per assicurarsi che tutto vada a posto. Intendo Internet Explorer :)


3
Ciò sarebbe rilevante se il nome del tag non è noto a IE. Qui il problema è un attributo personalizzato, non un tag personalizzato; la parola "tag" <tag ...>qui apparentemente significa solo qualsiasi tag HTML.
— Jukka K. Korpela,

Questo non invalida anche XHTML (a meno che non sia un tag riconosciuto)?
— Paul,

0

bene! puoi effettivamente creare un gruppo di attributi HTML personalizzati nascondendo gli attributi dei dati in ciò che desideri effettivamente.

per esempio.

[attribute='value']{
color:red;
}
<span attribute="value" >hello world</span>

Apparentemente funziona, ma ciò invaliderebbe il tuo documento, non è necessario utilizzare JScript per avere attributi personalizzati o anche elementi a meno che non sia necessario, devi solo trattare i tuoi nuovi attributi formulati (personalizzati) nello stesso modo in cui tratti il ​​tuo attributo "dati"

Ricorda che "non valido" non significa nulla. Il documento verrà caricato sempre bene. e alcuni browser in realtà convaliderebbero il tuo documento solo con la presenza di DOCTYPE ....., sai davvero cosa intendo.


-8

Puoi fare qualcosa del genere per estrarre il valore desiderato da JavaScript anziché un attributo:

<a href='#' class='click'>
    <span style='display:none;'>value for JavaScript</span>some text
</a>

Gli attributi esistono per un motivo; come le cose piace <input type="hidden" value="...">. Considera, tuttavia, la differenza tra il tipo di dati che inserisci in vari attributi in contrasto con i dati che potresti inserire in un campo nascosto. Nascondere un <span>(di tutte le cose) in un <a>per mantenere un pezzo di metadati non è una buona mossa. Sarebbe peculiare al tuo sito e molto dipendente da JS (grazioso degrado, persone).
— Jay Edwards,
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.