Como faço referência a uma propriedade de objeto javascript com um hífen?

106

Usando este script para fazer um objeto de estilo de todos os estilos herdados etc.

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

com o seguinte, o primeiro alerta funcionará bem, mas o segundo não ... ele está interpretando o -como um menos, presumo ... o depurador diz 'erro de referência não detectado'. Não posso colocar aspas ao redor, porque não é uma string. Então, como faço para usar essa propriedade de objeto?

Damon
fonte
Damon, abordando a ambigüidade e confusão (refletida também pelas respostas divergentes e os votos negativos adicionados / removidos dependendo da interpretação ...): você quis dizer especificamente as propriedades CSS, conforme sugerido pelo seu exemplo e assumido pela maioria das respostas, ou quaisquer propriedades JS , em geral, conforme indicado pelo título e a falta de uma CSStag? [Sim, eu sei que já se passaram 7 anos. :)]
Sz.
@Sz. Eu quis dizer any js propertyporque eu estava tendo um problema em fazer referência a uma propriedade que tinha um hífen (que também era uma propriedade css ... eu não percebi que havia outro problema com o que eu estava tentando fazer). Então é estranho que acaba cobrindo 2 questões diferentes. mas eu diria que a resposta principal explica os dois problemas.
Damon,

Respostas:

154

EDITAR

Observe os comentários, você verá que, para as propriedades de css, a notação de chave não é compatível com várias propriedades. Usar a notação de chave de caixa de camelo, portanto, é a maneira atual

obj.style-attr // would become 

obj["styleAttr"]

Use notação chave em vez de ponto

style["text-align"]

Todos os arrays em js são objetos e todos os objetos são apenas arrays associativos, isso significa que você pode se referir a um local em um objeto da mesma forma que se referiria a uma chave em um array.

arr[0]

ou o objeto

obj["method"] == obj.method

algumas coisas a serem lembradas ao acessar propriedades desta forma

  1. eles são avaliados, então use strings, a menos que você esteja fazendo algo com um contador ou usando nomes de métodos dinâmicos.

    isso significa que obj [método] forneceria um erro indefinido, enquanto obj ["método"] não

  2. Você deve usar esta notação se estiver usando caracteres que não são permitidos em variáveis ​​js.

Esta regex resume muito bem

[a-zA-Z_$][0-9a-zA-Z_$]*
Austinbv
fonte
1
a notação de chave não se aplica aqui - css define estilos usando caixa de camelo nas chaves: jsfiddle.net/49vkD
Brian
qual navegador? Falha para mim no hífen fica no IE7, IE8, FFX 3.5. E, por falha, quero dizer exibe "indefinido" para ambos ...
Brian
@brian testado em safári e exibe cromo vermelho, vermelho, centro, centro. Vou tentar ff agora
austinbv
@brian interessante, não funcionava no firefox6, não sabia disso ... aprender algo novo todos os dias
austinbv
1
Removido meu voto negativo, pois outro respondente apontava que a coleção CSS era o assunto da pergunta, mas a questão real era como obter uma propriedade hifenizada.
Brian de
18

As propriedades CSS com a -são representadas em camelCase em objetos Javascript. Isso seria:

alert( style.textAlign );

Você também pode usar uma notação de colchetes para usar a string:

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

Os nomes das propriedades podem conter apenas caracteres, números, o $sinal conhecido e o _(graças a pimvdb).

Andy
fonte
o último funciona ... uma daquelas coisas de sintaxe que eu perdi. o script que referenciei usa os nomes de estilo css regulares, mas ainda é útil saber sobre!
Damon
os nomes das propriedades não podem começar com números
austinbv
Os nomes das propriedades podem conter uma grande quantidade de caracteres Unicode. Está tudo bem com as especificações e com os navegadores. Por exemplo:var ò_ó = 'angry';
Camilo Martin
Não use o segundo código. As propriedades CSS são revestidas de camelo. Seu código pode funcionar em alguns navegadores, mas não é padrão.
Oriol
17

A resposta à pergunta original é: coloque o nome da propriedade entre aspas e use a indexação de estilo de matriz:

obj['property-with-hyphens'];

Muitos apontaram que a propriedade em que você está interessado é uma propriedade CSS. As propriedades CSS que possuem hifens são convertidas automaticamente em letras maiúsculas e minúsculas. Nesse caso, você pode usar o nome camel case como:

style.textAlign;

No entanto, esta solução só funciona para propriedades CSS. Por exemplo,

obj['a-b'] = 2;
alert(obj.aB);          // undefined
alert(obj['a-b']);      // 2
Stoney
fonte
2
@Brian Você está correto para as propriedades CSS. No entanto, eu estava respondendo à pergunta geral original "Como faço referência a uma propriedade de objeto javascript com um hífen?" Aqui está uma versão atualizada do seu jsfiddle: jsfiddle.net/49vkD/1
Stoney
1
na verdade, estreitei o escopo das respostas aqui por conta própria - presumi que o OP significava especificamente objetos de estilo. Removido meu voto negativo porque a questão era um pouco mais aberta do que isso.
Brian de
Eu acho que você está correto. Isso é provavelmente o que Damon queria. Eu li muito literalmente.
Stoney
Você deve usar o nome de camelo. Não posso .
Oriol
9

Use colchetes:

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

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

Mais informações sobre objetos: MDN

NOTA: Se você estiver acessando o objeto de estilo , CSSStyleDeclaration , use o camelCase necessário para acessá-lo a partir do javascript. Mais informações aqui

Joe
fonte
1
Você não está me apaziguando - você está apaziguando o w3c standard, de acordo com vários outros respondentes a esta pergunta: w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties , mas votou da mesma forma. ..
Brian de
Não use este código. Não é que as propriedades CSS com caixa de camelo sejam mais cruzadas, é que usar hífens em vez de caixa de camelo não é padrão e não deve funcionar.
Oriol
4
alert(style.textAlign)

ou

alert(style["textAlign"]);
Brian
fonte
4

Para responder diretamente à pergunta: style['text-align']é como você faria referência a uma propriedade com um hífen. Mas style.textAlign(ou style['textAlign']) é o que deve ser usado neste caso.

Dawson Toth
fonte
Não use isso. As propriedades CSS são revestidas de camelo. Seu código pode funcionar em alguns navegadores, mas não é padrão.
Oriol
Ajustado para usar caixa de camelo.
Dawson Toth
3

Para resolver seu problema : As propriedades CSS com hífens neles são representadas por propriedades JavaScript em camelCase para evitar esse problema. Você quer:style.textAlign .

Para responder à pergunta : Use a notação de colchetes : obj.propé o mesmo que obj["prop"]para que você possa acessar nomes de propriedades usando strings e usar caracteres proibidos em identificadores.

Quentin
fonte
2

Os nomes das propriedades do objeto não são correspondências um-para-um para os nomes css.

Doug Chamberlain
fonte
2

Eu acho que no caso de estilos CSS eles são alterados para camelCase em Javascript e assim test-alignse torna textAlign. No caso geral em que você deseja acessar uma propriedade que contém caracteres não padrão, você usa o estilo de matriz. ['text-align']

GordonM
fonte
0

No início, me pergunto por que a solução não funcionou no meu fim

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

... mais tarde descobrir que acessar atributos de dados é diferente: Deve ser assim:

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

Espero que isto ajude!

Woppi
fonte