2014-09-16 17 views
39

Recentemente stavo programmando il codice e mi sono imbattuto in un problema strano. Stavo tentando di assegnare un attributo dati a un nuovo elemento che avevo creato (tramite jQuery), solo per scoprire che non avrebbe effettivamente assegnato l'attributo. Vedere sul link qui sotto per un esempio, il codice è riportato di seguito:JQuery .data() non funziona?

http://jsfiddle.net/y95p100c/1/

Qualsiasi idea del perché questo sta accadendo? Non ho mai imbattuto in questo ...

var div = $("<div />") 
$(div).data("foo", "bar") 
console.log($(div)[0].outerHTML) // prints <div></div> 
+0

La funzione '.data()' di jQuery memorizza i valori internamente. – j08691

risposta

99

data non impostaredata-* attributi. Gestisce una cache di dati non correlata agli attributi data-*. Esso inizializza da data-* attributi se sono presenti, ma non li scrive mai. Per scrivere su un attributo, utilizzare attr.

Esempio: Updated Fiddle

var div = $("<div />") 
$(div).attr("data-foo", "bar") 
console.log($(div)[0].outerHTML) 

Quello che stai vedendo è solo uno dei molti modi in cui questo può essere sorprendente. Un altro è che se il markup è <div id="elm" data-foo="bar"></div> e ad un certo punto si utilizza $("#elm").data("foo") per ottenere il valore (e sarà davvero "bar"), poi si fa $("#elm").data("foo", "update"), l'attributo rimane data-foo="bar" ma i dati gestiti da data ora ha foo pari a "update". Ma la regola sopra lo spiega: data mai scrive a data-* attrs.

+2

interessante, ho anche provato .prop() e ha fallito pure. Grazie! – user1143682

+2

@ user1143682: perché gli attributi non sono proprietà. :-) Solo che molti attributi predefiniti hanno proprietà riflesse ('id',' className', 'rel',' src', ...). ('prop' probabilmente * ha * creato una proprietà sull'elemento' div', ma quelli non sono serializzati quando si guarda 'outerHTML', perché non sono HTML.) –

+0

Si è imbattuto in questo stesso identico problema; buona risposta, ha aiutato a chiarirlo per me. –

18

jQuery importa gli attributi data- quando l'elemento viene caricato, ma non lo accede in seguito. Gli elementi sono memorizzati in una struttura interna jQuery. Da the API:

I data- attributi sono tirati in un primo tempo la proprietà dei dati si accede e quindi non sono più accessibili o mutato (tutti i valori dei dati vengono poi memorizzati internamente in jQuery).

+2

+1 18:49:44 (nel mio fuso orario) vs. 18:49:53. Wow. Solo wow. –