Come faccio a fare riferimento a una proprietà di un oggetto javascript con un trattino al suo interno?


106

Utilizzando questo script per creare un oggetto di stile di tutti gli stili ereditati ecc.

var style = css($(this));
alert (style.width);
alert (style.text-align);

con quanto segue, il primo avviso funzionerà bene, ma il secondo no .. sta interpretando il -come un segno meno presumo .. il debugger dice "errore di riferimento non rilevato". Non posso racchiudere le virgolette, però, perché non è una stringa. Allora come si usa questa proprietà dell'oggetto?


Damon, affrontando l'ambiguità e la confusione (riflesse anche dalle risposte divergenti e dai voti negativi aggiunti / rimossi a seconda dell'interpretazione ...): intendevi specificamente le proprietà CSS, come suggerito dal tuo esempio e assunto dalla maggior parte delle risposte, o qualsiasi proprietà JS , in generale, come indicato dal titolo e dalla mancanza di CSStag? [Sì, lo so che sono passati 7 anni. :)]
Sz.

@Sz. Intendevo any js propertyperché avevo un problema con il riferimento a una proprietà che conteneva un trattino (che era anche una proprietà CSS ... non mi rendevo conto che c'era un altro problema con quello che stavo cercando di fare). Quindi è strano che finisce per coprire 2 problemi diversi. ma direi che la risposta migliore spiega entrambi i problemi.
Damon

Risposte:


154

MODIFICARE

Guardando i commenti vedrai che per le proprietà css la notazione della chiave non è compatibile con un certo numero di proprietà. L'uso della notazione della chiave delle maiuscole è quindi il modo corrente

obj.style-attr // would become 

obj["styleAttr"]

Usa la notazione chiave invece del punto

style["text-align"]

Tutti gli array in js sono oggetti e tutti gli oggetti sono solo array associativi, questo significa che puoi fare riferimento a una posizione in un oggetto proprio come faresti con una chiave in un array.

arr[0]

o l'oggetto

obj["method"] == obj.method

un paio di cose da ricordare quando si accede alle proprietà in questo modo

  1. vengono valutati quindi usa le stringhe a meno che tu non stia facendo qualcosa con un contatore o usando nomi di metodi dinamici.

    questo significa che obj [metodo] ti darebbe un errore indefinito mentre obj ["metodo"] no

  2. È necessario utilizzare questa notazione se si utilizzano caratteri non consentiti nelle variabili js.

Questa regex lo riassume praticamente

[a-zA-Z_$][0-9a-zA-Z_$]*

1
la notazione chiave non si applica qui - CSS definisce gli stili utilizzando il caso del cammello nelle chiavi: jsfiddle.net/49vkD
Brian

quale browser? Non riesce per me sul trattino ottiene in IE7, IE8, FFX 3.5. E per fallimenti intendo i display "indefiniti" per entrambi ...
Brian

@brian testato in safari e chrome mostra rosso, rosso, centro, centro. Proverò in ff ora
austinbv

@brian interessante, non funzionava in firefox6, non lo sapevo ... impara qualcosa di nuovo ogni giorno
austinbv

1
Rimosso il mio downvote poiché un altro risponditore ha sottolineato che la raccolta CSS è stata oggetto di una domanda, ma la vera domanda era come ottenere una proprietà con trattino.
Brian

18

Le proprietà CSS con una -sono rappresentate in camelCase negli oggetti Javascript. Sarebbe:

alert( style.textAlign );

Puoi anche usare una notazione tra parentesi per usare la stringa:

alert( style['text-align'] );

I nomi delle proprietà possono contenere solo caratteri, numeri, il $segno ben noto e _(grazie a pimvdb).


quest'ultimo funziona .. una di quelle cose sintattiche che mi sono appena perso. lo script a cui ho fatto riferimento utilizza i normali nomi in stile CSS, ma è comunque utile sapere!
Damon

i nomi delle proprietà non possono però iniziare con numeri
austinbv

I nomi delle proprietà possono contenere una vasta quantità di caratteri Unicode. Va bene con le specifiche e va bene con i browser. Ad esempio:var ò_ó = 'angry';
Camilo Martin,

Non utilizzare il secondo codice. Le proprietà CSS sono a forma di cammello. Il tuo codice potrebbe funzionare su alcuni browser ma non è standard.
Oriol

17

La risposta alla domanda originale è: inserire il nome della proprietà tra virgolette e utilizzare l'indicizzazione in stile array:

obj['property-with-hyphens'];

Molti hanno sottolineato che la proprietà che ti interessa è una proprietà CSS. Le proprietà CSS che hanno trattini vengono automaticamente convertite in maiuscolo. In tal caso puoi usare il nome in cammello come:

style.textAlign;

Tuttavia questa soluzione funziona solo per le proprietà CSS. Per esempio,

obj['a-b'] = 2;
alert(obj.aB);          // undefined
alert(obj['a-b']);      // 2

2
@Brian Hai ragione per le proprietà CSS. Tuttavia, stavo rispondendo alla domanda generale originale "Come faccio a fare riferimento a una proprietà di un oggetto javascript con un trattino?" Ecco una versione aggiornata del tuo jsfiddle: jsfiddle.net/49vkD/1
Stoney

1
in effetti ho ristretto l'ambito delle risposte qui da solo - ho assunto che l'OP significasse specificamente oggetti di stile. Ho rimosso il mio voto negativo perché la domanda era un po 'più aperta di così.
Brian

Penso che tu abbia ragione. Questo è probabilmente quello che voleva Damon. L'ho letto troppo alla lettera.
Stoney

È necessario utilizzare il nome con carter cammello. Non posso .
Oriol

9

Usa parentesi:

var notTheFlippingStyleObject = {
    'a-b': 1
};

console.log(notTheFlippingStyleObject["a-b"] === 1); // true

Maggiori informazioni sugli oggetti: MDN

NOTA: se stai accedendo all'oggetto di stile , CSSStyleDeclaration , usa must camelCase per accedervi da javascript. Maggiori info qui


1
Non mi stai placando - stai appagando lo standard w3c, secondo numerosi altri rispondenti a questa domanda: w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties , ma hai votato ugualmente. ..
Brian

Non utilizzare questo codice. Non è che le proprietà CSS in camel siano più cross-browser, è che l'uso di trattini invece di camel case non è standard e non dovrebbe funzionare.
Oriol

4
alert(style.textAlign)

o

alert(style["textAlign"]);

4

Per rispondere direttamente alla domanda: style['text-align']è come faresti riferimento a una proprietà con un trattino al suo interno. Ma style.textAlign(o style['textAlign']) è ciò che dovrebbe essere usato in questo caso.


Non usare questo. Le proprietà CSS sono a forma di cammello. Il tuo codice potrebbe funzionare su alcuni browser ma non è standard.
Oriol

Adattato per utilizzare la custodia del cammello.
Dawson Toth



2

I nomi delle proprietà degli oggetti non sono corrispondenze uno a uno per i nomi css.


2

Penso che nel caso degli stili CSS vengano modificati in camelCase in Javascript così test-aligndiventa textAlign. Nel caso generale in cui si desidera accedere a una proprietà che contiene caratteri non standard, si utilizza lo stile array. ['text-align']


0

All'inizio, mi chiedo perché la soluzione non abbia funzionato da parte mia

api['data-sitekey'] //returns undefined

... in seguito scopri che l'accesso agli attributi dei dati è diverso: dovrebbe essere così:

var api = document.getElementById("some-api");
api.dataset.sitekey

Spero che questo ti aiuti!

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.