Comment référencer une propriété d'objet javascript avec un trait d'union?

106

Utilisation de ce script pour créer un objet de style de tous les styles hérités etc.

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

avec ce qui suit, la première alerte fonctionnera bien, mais la seconde ne fonctionnera pas ... elle interprète le -comme un moins je suppose ... le débogueur dit «erreur de référence non interceptée». Cependant, je ne peux pas mettre de guillemets autour, car ce n'est pas une chaîne. Alors, comment utiliser cette propriété d'objet?

Damon
la source
Damon, abordant l'ambiguïté et la confusion (reflétées également par les réponses divergentes et les votes négatifs ajoutés / supprimés en fonction de l'interprétation ...): vouliez-vous dire spécifiquement les propriétés CSS, comme l'indique votre exemple et supposées par la plupart des réponses, ou des propriétés JS , en général, comme indiqué par le titre et l'absence de CSSbalise? [Oui, je sais que ça fait 7 ans. :)]
Sz.
@Sz. Je voulais dire any js propertyparce que j'avais un problème avec le référencement d'une propriété contenant un trait d'union (qui se trouvait également être une propriété css ... je ne savais pas qu'il y avait un autre problème avec ce que j'essayais de faire). C'est donc un problème étrange qui finit par couvrir 2 problèmes différents. mais je dirais que la première réponse explique les deux problèmes.
Damon

Réponses:

154

ÉDITER

Regardez les commentaires, vous verrez que pour les propriétés css, la notation par clé n'est pas compatible avec un certain nombre de propriétés. L'utilisation de la notation clé en cas de chameau est donc la méthode actuelle

obj.style-attr // would become 

obj["styleAttr"]

Utilisez la notation clé plutôt que le point

style["text-align"]

Tous les tableaux de js sont des objets et tous les objets ne sont que des tableaux associatifs, ce qui signifie que vous pouvez faire référence à un endroit dans un objet comme vous le feriez pour une clé dans un tableau.

arr[0]

ou l'objet

obj["method"] == obj.method

quelques points à retenir lors de l'accès aux propriétés de cette façon

  1. ils sont évalués donc utilisez des chaînes sauf si vous faites quelque chose avec un compteur ou en utilisant des noms de méthodes dynamiques.

    cela signifie que obj [méthode] vous donnerait une erreur non définie alors que obj ["méthode"] ne le ferait pas

  2. Vous devez utiliser cette notation si vous utilisez des caractères qui ne sont pas autorisés dans les variables js.

Cette regex résume à peu près tout

[a-zA-Z_$][0-9a-zA-Z_$]*
Austinbv
la source
1
la notation des touches ne s'applique pas ici - css définit les styles en utilisant la casse camel dans les clés: jsfiddle.net/49vkD
Brian
quel navigateur? Échoue pour moi sur le trait d'union obtient dans IE7, IE8, FFX 3.5. Et, par échec, je veux dire affiche "indéfini" pour les deux ...
Brian
@brian testé en safari et chromé affiche rouge, rouge, centre, centre. Je vais essayer en
FF
@brian intéressant, ne fonctionnait pas dans firefox6, je ne savais pas que ... apprenez quelque chose de nouveau chaque jour
austinbv
1
Suppression de mon vote défavorable car un autre répondant a souligné que la collection CSS était le sujet d'une question, mais la question réelle était de savoir comment obtenir une propriété avec trait d'union.
Brian
18

Les propriétés CSS avec un -sont représentées dans camelCase dans les objets Javascript. Ce serait:

alert( style.textAlign );

Vous pouvez également utiliser une notation entre crochets pour utiliser la chaîne:

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

Les noms de propriétés ne peuvent contenir que des caractères, des chiffres, le $signe bien connu et le _(merci à pimvdb).

jAndy
la source
ce dernier fonctionne ... une de ces choses syntaxiques que je viens de manquer. le script que j'ai référencé utilise les noms de style css normaux, mais toujours utile à connaître!
Damon
les noms de propriétés ne peuvent pas commencer par des nombres
austinbv
Les noms de propriété peuvent contenir une grande quantité de caractères Unicode. Ça va avec les spécifications et ça va avec les navigateurs. Par exemple:var ò_ó = 'angry';
Camilo Martin
N'utilisez pas le deuxième code. Les propriétés CSS sont en camel. Votre code peut fonctionner sur certains navigateurs mais n'est pas standard.
Oriol
17

La réponse à la question d'origine est: placez le nom de la propriété entre guillemets et utilisez l'indexation de style tableau:

obj['property-with-hyphens'];

Plusieurs ont souligné que la propriété qui vous intéresse est une propriété CSS. Les propriétés CSS qui ont des traits d'union sont automatiquement converties en boîtier camel. Dans ce cas, vous pouvez utiliser le nom en boîtier de chameau comme:

style.textAlign;

Cependant, cette solution ne fonctionne que pour les propriétés CSS. Par exemple,

obj['a-b'] = 2;
alert(obj.aB);          // undefined
alert(obj['a-b']);      // 2
Stoney
la source
2
@Brian Vous avez raison pour les propriétés CSS. Cependant, je répondais à la question générale d'origine "Comment référencer une propriété d'objet javascript avec un trait d'union?" Voici une version mise à jour de votre jsfiddle: jsfiddle.net/49vkD/1
Stoney
1
en fait, j'ai réduit la portée des réponses ici par moi-même - j'ai supposé que le PO désignait spécifiquement des objets de style. J'ai supprimé mon vote défavorable car la question était un peu plus ouverte que cela.
Brian
Je pense que vous avez raison. C'est probablement ce que voulait Damon. Je l'ai lu trop littéralement.
Stoney
Vous devez utiliser le nom camel cased. Je ne peux pas .
Oriol
9

Utilisez des crochets:

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

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

Plus d'infos sur les objets: MDN

REMARQUE: Si vous accédez à l' objet de style , CSSStyleDeclaration , utilisez must camelCase pour y accéder à partir de javascript. Plus d'infos ici

Joe
la source
1
Vous ne m'apaisez pas - vous apaisez la norme w3c, selon de nombreux autres répondants à cette question: w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties , mais a tout de même voté pour. ..
Brian
N'utilisez pas ce code. Ce n'est pas que les propriétés CSS camel cased sont plus multi-navigateurs, c'est que l'utilisation de tirets au lieu de camel case n'est pas standard et ne devrait pas fonctionner.
Oriol
4
alert(style.textAlign)

ou

alert(style["textAlign"]);
Brian
la source
4

Pour répondre directement à la question: style['text-align']comment référencer une propriété avec un trait d'union. Mais style.textAlign(ou style['textAlign']) est ce qui devrait être utilisé dans ce cas.

Dawson Toth
la source
Ne l'utilisez pas. Les propriétés CSS sont en camel. Votre code peut fonctionner sur certains navigateurs mais n'est pas standard.
Oriol
Ajusté pour utiliser un étui camel.
Dawson Toth
3

Pour résoudre votre problème : Les propriétés CSS contenant des traits d'union sont représentées par des propriétés JavaScript dans camelCase pour éviter ce problème. Vous voulez: style.textAlign.

Pour répondre à la question : Utilisez la notation entre crochets : obj.propest la même chose que obj["prop"]si vous pouvez accéder aux noms de propriétés à l'aide de chaînes et utiliser des caractères interdits dans les identificateurs.

Quentin
la source
2

Les noms de propriété d'objet ne correspondent pas un à un pour les noms css.

Doug Chamberlain
la source
2

Je pense que dans le cas des styles CSS , ils sont changés à camelCase en Javascript donc test-aligndevient textAlign. Dans le cas général où vous souhaitez accéder à une propriété contenant des caractères non standard, vous utilisez le style tableau. ['text-align']

GordonM
la source
0

Au début, je me demande pourquoi la solution n'a pas fonctionné de mon côté

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

... plus tard, découvrez que l'accès aux attributs de données est différent: cela devrait ressembler à ceci:

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

J'espère que cela t'aides!

Woppi
la source