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.