¿Cómo hago referencia a una propiedad de un objeto javascript con un guión?

106

Usando este script para hacer un objeto de estilo de todos los estilos heredados, etc.

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

con lo siguiente, la primera alerta funcionará bien, pero la segunda no ... se está interpretando -como un signo menos, supongo ... el depurador dice "error de referencia no detectado". Sin embargo, no puedo ponerlo entre comillas porque no es una cadena. Entonces, ¿cómo uso esta propiedad de objeto?

Damon
fuente
Damon, abordando la ambigüedad y la confusión (reflejada también por las respuestas divergentes y los votos negativos agregados / eliminados según la interpretación ...): ¿se refería específicamente a las propiedades CSS, como lo sugiere su ejemplo y lo asumen la mayoría de las respuestas, o cualquier propiedad de JS? , en general, como lo indica el título y la falta de una CSSetiqueta? [Sí, sé que han pasado 7 años. :)]
Sz.
@Sz. Me refiero a any js propertyque estaba teniendo un problema al hacer referencia a una propiedad que tenía un guión (que también resultó ser una propiedad css ... no me di cuenta de que había otro problema con lo que estaba tratando de hacer). Entonces es extraño que termina cubriendo 2 temas diferentes. pero diría que la respuesta principal explica ambos problemas.
Damon

Respuestas:

154

EDITAR

Mire los comentarios y verá que para las propiedades de CSS, la notación de claves no es compatible con varias propiedades. El uso de la notación de clave de caso camel, por lo tanto, es la forma actual

obj.style-attr // would become 

obj["styleAttr"]

Use notación clave en lugar de punto

style["text-align"]

Todas las matrices en js son objetos y todos los objetos son simplemente matrices asociativas, esto significa que puede referirse a un lugar en un objeto como lo haría con una clave en una matriz.

arr[0]

o el objeto

obj["method"] == obj.method

un par de cosas para recordar al acceder a las propiedades de esta manera

  1. se evalúan, así que use cadenas a menos que esté haciendo algo con un contador o usando nombres de métodos dinámicos.

    esto significa que obj [método] le daría un error indefinido mientras que obj ["método"] no

  2. Debe usar esta notación si está usando caracteres que no están permitidos en las variables js.

Esta expresión regular lo resume bastante bien

[a-zA-Z_$][0-9a-zA-Z_$]*
Austinbv
fuente
1
la notación de clave no se aplica aquí: css define estilos usando el caso de camello en las claves: jsfiddle.net/49vkD
Brian
que navegador Me falla en el guión en IE7, IE8, FFX 3.5. Y, por errores me refiero a pantallas "indefinidas" para ambos ...
Brian
@brian probado en safari y cromo muestra rojo, rojo, centro, centro. Lo intentaré en ff ahora
austinbv
@brian interesante, no funcionó en firefox6, no sabía que ... aprender algo nuevo todos los días
Austinbv
1
Eliminé mi voto negativo cuando otro respondedor señaló que la colección de CSS resultó ser el tema de la pregunta, pero la pregunta real era cómo obtener una propiedad con guión.
Brian
18

Las propiedades CSS con una -se representan en camelCase en objetos Javascript. Eso sería:

alert( style.textAlign );

También puede usar una notación entre corchetes para usar la cadena:

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

Los nombres de las propiedades solo pueden contener caracteres, números, el $signo conocido y el _(gracias a pimvdb).

jAndy
fuente
el último funciona ... una de esas cosas de sintaxis que me perdí. el script al que hice referencia usa los nombres de estilo CSS regulares, ¡pero aún es útil conocerlo!
Damon
Sin embargo
austinbv
Los nombres de propiedad pueden contener una gran cantidad de caracteres Unicode. Está bien con las especificaciones y está bien con los navegadores. Por ejemplo:var ò_ó = 'angry';
Camilo Martin
No use el segundo código. Las propiedades CSS están en formato camel. Su código puede funcionar en algunos navegadores, pero no es estándar.
Oriol
17

La respuesta a la pregunta original es: coloque el nombre de la propiedad entre comillas y use la indexación de estilo de matriz:

obj['property-with-hyphens'];

Varios han señalado que la propiedad que le interesa es una propiedad CSS. Las propiedades CSS que tienen guiones se convierten automáticamente a carcasa de camello. En ese caso, puede usar el nombre en mayúsculas de camello como:

style.textAlign;

Sin embargo, esta solución solo funciona para propiedades CSS. Por ejemplo,

obj['a-b'] = 2;
alert(obj.aB);          // undefined
alert(obj['a-b']);      // 2
Stoney
fuente
2
@Brian Tienes razón para las propiedades CSS. Sin embargo, estaba respondiendo a la pregunta general original "¿Cómo hago referencia a una propiedad de objeto javascript con un guión?" Aquí hay una versión actualizada de su jsfiddle: jsfiddle.net/49vkD/1
Stoney
1
de hecho, reduje el alcance de las respuestas aquí por mi cuenta: asumí que el OP significaba específicamente objetos de estilo. Eliminé mi voto en contra ya que la pregunta era un poco más abierta que eso.
Brian
Creo que es correcto. Eso es lo que probablemente quería Damon. Lo leo demasiado literalmente.
Stoney
Usted debe utilizar el nombre de entubado camello. No puedo .
Oriol
9

Utilice corchetes:

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

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

Más información sobre objetos: MDN

NOTA: Si está accediendo al objeto de estilo , CSSStyleDeclaration , use must camelCase para acceder a él desde javascript. Más info aquí

Joe
fuente
1
No me está apaciguando, está apaciguando el estándar w3c, según muchos otros que respondieron a esta pregunta: w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties , pero votaron a favor de todos modos. ..
Brian
No utilice este código. No es que las propiedades de CSS en mayúsculas y minúsculas sean más entre navegadores, es que usar guiones en lugar de mayúsculas y minúsculas no es estándar y no debería funcionar.
Oriol
4
alert(style.textAlign)

o

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

Para responder directamente a la pregunta: style['text-align']es cómo se haría referencia a una propiedad con un guión. Pero style.textAlign(o style['textAlign']) es lo que debería usarse en este caso.

Dawson Toth
fuente
No utilices esto. Las propiedades CSS están en formato camel. Su código puede funcionar en algunos navegadores, pero no es estándar.
Oriol
Ajustado para usar estuche camel.
Dawson Toth
3

Para resolver su problema : Las propiedades CSS con guiones están representadas por propiedades JavaScript en camelCase para evitar este problema. Que desea: style.textAlign.

Para responder a la pregunta : Use la notación de corchetes : obj.propes lo mismo que obj["prop"]para que pueda acceder a los nombres de las propiedades usando cadenas y use caracteres que están prohibidos en los identificadores.

Quentin
fuente
2

Los nombres de propiedad del objeto no son coincidencias uno a uno para los nombres css.

Doug Chamberlain
fuente
2

Creo que en el caso de los estilos CSS, se cambian a camelCase en Javascript, por lo que se test-alignconvierte textAlign. En el caso general en el que desea acceder a una propiedad que contiene caracteres no estándar, utiliza el estilo de matriz. ['text-align']

GordonM
fuente
0

Al principio, me pregunto por qué la solución no funcionó por mi parte

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

... más adelante, descubra que acceder a los atributos de datos es diferente: debería ser así:

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

¡Espero que esto ayude!

Woppi
fuente