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, 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_$]*

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).


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

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


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"]);

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.


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



2

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


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']


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!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.