2011-08-03 15 views
7

per i meta dati sulla pagina utilizzando nomi degli attributi come table:rowNum:<name>, ad esempio,in javascript dom, ci sono regole per attribuire nomi?

 
var row = document.createElement('tr'); 
row.setAttribute('tup','emp:1'); 
row.setAttribute('emp:1:pkid','123'); 

hanno utilizzato nomi delimitati da due punti (ad esempio, name='emp:1:emp_id') per anni con buon successo, ma oggi ha ottenuto po 'con i nomi degli attributi delimitato da due punti

in particolare:

 
var el2 = row.parentNode.querySelector("[emp:1:pkid]"); 
=> `Error: SYNTAX_ERR: DOM Exception 12` 

sono caratteri speciali come ':' illegale in dom attribuiscono nomi? caratteri speciali possono essere sfuggiti per funzionare con querySelector()?


dalla console chrome:

 
> row.parentNode.querySelector('[emp:1:pkid]'); 
Error: SYNTAX_ERR: DOM Exception 12 

come da James (sotto):

 
> row.parentNode.querySelector('[emp\\:1\\:pkid]'); 
123 

ma il problema - non funziona con getAttribute - pia

 
> row.getAttribute('emp:1:pkid'); 
123 
> row.getAttribute('emp\\:1\\:pkid'); 
null 
+0

interessante e non ne sono ancora sicuro (cercandolo). Nel frattempo, per i progetti futuri, considera l'uso di 'data()' di jQuery. Ti consente di impostare qualsiasi dato arbitrario e associarlo con i tuoi elementi dom (sia dal server in modo che i tuoi js possano usarlo sia dal lato client.) Http://api.jquery.com/jQuery.data/ – Milimetric

+0

Gli attributi DOM sono di digita DOMString che è una sequenza codificata UTF-16. Per quanto posso dire, i caratteri che stai usando dovrebbero andare bene, non sono sicuro al 100%, anche se di conseguenza il commento piuttosto che la risposta: –

+0

@cc young - ' querySelector ('[emp \\: 1]') 'restituirà' null' perché non corrisponde ad un elemento (basato sull'esempio che hai pubblicato originariamente). Intendevi '[emp \\: 1 \\: update ] '? –

risposta

4

Sembra che puoi sfuggire ai personaggi speciali con un doppio backslash:

var el2 = element.querySelector("[emp\\:1\\:update]"); 

Credo che il problema è a che fare con il fatto che i due punti normalmente indica un elemento pseudo.

Secondo lo WHATWG spec, qualsiasi carattere eccetto quelli che cambierebbero il contesto (ad esempio un carattere uguale, come quello che specifica l'inizio del valore o un carattere maggiore di quello che specifica la fine del tag). Su questa base, va bene usare i due punti nei nomi degli attributi.

Aggiornamento (sulla base di commenti su risposta e aggiornamenti su domanda)

di utilizzare una variabile sia con querySelector e getAttribute, si potrebbe fare qualcosa di simile, o si può solo memorizzare la versione con caratteri di escape, e uno senza (che sarebbe sicuramente la mia opzione preferita):

var s = "emp\\:1\\:update"; 
console.log(row.getAttribute(s.replace(/\\/g, ""))); 
+0

buona intuizione, ma problema: funziona bene con 'querySelector()' ma _fails_ con 'getAttribute()' - vedi l'area del problema ad esempio –

+0

Sbarazzati delle parentesi quadre. 'getAttribute' tak es l'intera stringa passata come il nome dell'attributo. –

+0

parentesi quadre: problema con il taglio e incolla sul testo di esempio. il problema rimane. –

Problemi correlati