Wie verweise ich auf eine Javascript-Objekteigenschaft mit einem Bindestrich?

105

Verwenden dieses Skripts , um ein Stilobjekt aller geerbten Stile usw. zu erstellen.

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

Mit der folgenden Funktion funktioniert die erste Warnung einwandfrei, die zweite jedoch nicht. -Ich nehme an, sie interpretiert das als Minus. Der Debugger sagt "nicht erfasster Referenzfehler". Ich kann es jedoch nicht in Anführungszeichen setzen, da es sich nicht um eine Zeichenfolge handelt. Wie verwende ich diese Objekteigenschaft?

Damon
quelle
Damon, der sich mit der Mehrdeutigkeit und Verwirrung befasst (was sich auch in den unterschiedlichen Antworten und den hinzugefügten / entfernten Abstimmungen je nach Interpretation widerspiegelt ...): Meinten Sie speziell CSS-Eigenschaften, wie in Ihrem Beispiel angedeutet und von den meisten Antworten angenommen, oder JS-Eigenschaften im Allgemeinen, wie durch den Titel und das Fehlen eines CSSTags angezeigt ? [Ja, ich weiß, es sind 7 Jahre vergangen. :)]
Gr.
@Sz. Ich meinte, any js propertyweil ich ein Problem mit der Referenzierung einer Eigenschaft hatte, die einen Bindestrich enthielt (was auch eine CSS-Eigenschaft war ... ich wusste nicht, dass es ein anderes Problem mit dem gab, was ich versuchte). Es ist also eine seltsame Sache, die am Ende zwei verschiedene Themen abdeckt. Aber ich würde sagen, die Top-Antwort erklärt beide Probleme.
Damon

Antworten:

153

BEARBEITEN

In den Kommentaren sehen Sie, dass die Notation für CSS-Eigenschaften mit einer Reihe von Eigenschaften nicht kompatibel ist. Die Verwendung der Notation des Kamelkastens ist daher der derzeitige Weg

obj.style-attr // would become 

obj["styleAttr"]

Verwenden Sie die Tastenschreibweise anstelle des Punkts

style["text-align"]

Alle Arrays in js sind Objekte und alle Objekte sind nur assoziative Arrays. Dies bedeutet, dass Sie auf eine Stelle in einem Objekt genauso verweisen können wie auf einen Schlüssel in einem Array.

arr[0]

oder das Objekt

obj["method"] == obj.method

Ein paar Dinge, die Sie beachten sollten, wenn Sie auf diese Weise auf Eigenschaften zugreifen

  1. Sie werden ausgewertet. Verwenden Sie daher Zeichenfolgen, es sei denn, Sie tun etwas mit einem Zähler oder verwenden dynamische Methodennamen.

    Dies bedeutet, dass obj [Methode] Ihnen einen undefinierten Fehler geben würde, während obj ["Methode"] dies nicht tun würde

  2. Sie müssen diese Notation verwenden, wenn Sie Zeichen verwenden, die in js-Variablen nicht zulässig sind.

Diese Regex fasst es ziemlich gut zusammen

[a-zA-Z_$][0-9a-zA-Z_$]*
austinbv
quelle
1
Die Schlüsselnotation gilt hier nicht - CSS definiert Stile unter Verwendung der Kamel-Groß- / Kleinschreibung in den Schlüsseln: jsfiddle.net/49vkD
Brian
Welcher Browser? Schlägt für mich der Bindestrich in IE7, IE8, FFX 3.5. Und mit Fehlschlägen meine ich Anzeigen "undefiniert" für beide ...
Brian
@brian getestet in Safari und Chrom zeigt rot, rot, Mitte, Mitte. Ich werde es jetzt in ff versuchen
austinbv
@brian interessant, funktionierte nicht in Firefox6, ich wusste nicht, dass ... jeden Tag etwas Neues lernen
Austinbv
1
Ich habe meine Ablehnung entfernt, als ein anderer Antwortender darauf hinwies, dass die CSS-Sammlung zufällig Gegenstand der Frage war, aber die eigentliche Frage war, wie man eine Eigenschaft mit Bindestrich erhält.
Brian
18

CSS-Eigenschaften mit a -werden in camelCase in Javascript-Objekten dargestellt. Das wäre:

alert( style.textAlign );

Sie können auch eine Klammernotation verwenden, um die Zeichenfolge zu verwenden:

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

Eigenschaftsnamen dürfen nur Zeichen, Zahlen, das bekannte $Zeichen und das _(dank pimvdb) enthalten.

jAndy
quelle
Letzteres funktioniert. Eines dieser Syntax-Dinge, die ich gerade verpasst habe. Das Skript, auf das ich verwiesen habe, verwendet die regulären CSS-Stilnamen, ist aber dennoch nützlich zu wissen!
Damon
Eigenschaftsnamen können jedoch nicht mit Zahlen beginnen
austinbv
Eigenschaftsnamen können eine große Anzahl von Unicode-Zeichen enthalten. Es ist in Ordnung mit der Spezifikation und es ist in Ordnung mit den Browsern. Zum Beispiel:var ò_ó = 'angry';
Camilo Martin
Verwenden Sie nicht den zweiten Code. CSS-Eigenschaften sind Kamel-Gehäuse. Ihr Code funktioniert möglicherweise in einigen Browsern, ist jedoch nicht Standard.
Oriol
17

Die Antwort auf die ursprüngliche Frage lautet: Setzen Sie den Eigenschaftsnamen in Anführungszeichen und verwenden Sie die Indexierung im Array-Stil:

obj['property-with-hyphens'];

Einige haben darauf hingewiesen, dass die Eigenschaft, an der Sie interessiert sind, eine CSS-Eigenschaft ist. CSS-Eigenschaften mit Bindestrichen werden automatisch in Kamelhüllen konvertiert. In diesem Fall können Sie den Namen in Kamelhülle wie folgt verwenden:

style.textAlign;

Diese Lösung funktioniert jedoch nur für CSS-Eigenschaften. Beispielsweise,

obj['a-b'] = 2;
alert(obj.aB);          // undefined
alert(obj['a-b']);      // 2
Stoney
quelle
2
@Brian Sie sind korrekt für CSS-Eigenschaften. Ich beantwortete jedoch die ursprüngliche allgemeine Frage "Wie verweise ich auf eine Javascript-Objekteigenschaft mit einem Bindestrich?" Hier ist eine aktualisierte Version Ihrer jsfiddle: jsfiddle.net/49vkD/1
Stoney
1
in der Tat habe ich den Umfang der Antworten hier selbst eingegrenzt - ich nahm an, dass das OP spezifisch Stilobjekte meinte. Ich habe meine Ablehnung entfernt, da die Frage etwas offener war.
Brian
Ich denke du bist richtig. Das ist es, was Damon wahrscheinlich wollte. Ich habe es zu wörtlich gelesen.
Stoney
Sie müssen den Namen in Kamelhülle verwenden. Nicht kann .
Oriol
9

Verwenden Sie Klammern:

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

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

Weitere Infos zu Objekten: MDN

HINWEIS: Wenn Sie die zugreifen Stil Objekt, CSSStyleDeclaration , Camelcase verwenden müssen , um Zugriff es von Javascript. Mehr Infos hier

Joe
quelle
1
Sie beschwichtigen mich nicht - Sie beschwichtigen den w3c-Standard gemäß zahlreichen anderen Antworten auf diese Frage: w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties , aber trotzdem positiv bewertet. ..
Brian
Verwenden Sie diesen Code nicht. Es ist nicht so, dass CSS-Eigenschaften mit Kamelgehäuse eher browserübergreifend sind, sondern dass die Verwendung von Bindestrichen anstelle von Groß- und Kleinschreibung nicht Standard ist und nicht funktionieren sollte.
Oriol
4
alert(style.textAlign)

oder

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

Um die Frage direkt zu beantworten: style['text-align']So würden Sie auf eine Eigenschaft mit einem Bindestrich verweisen. Aber style.textAlign(oder style['textAlign']) sollte in diesem Fall verwendet werden.

Dawson Toth
quelle
Verwenden Sie dies nicht. CSS-Eigenschaften sind Kamel-Gehäuse. Ihr Code funktioniert möglicherweise in einigen Browsern, ist jedoch nicht Standard.
Oriol
Angepasst, um Kamelkoffer zu verwenden.
Dawson Toth
3

So lösen Sie Ihr Problem : Die CSS-Eigenschaften mit Bindestrichen werden in camelCase durch JavaScript-Eigenschaften dargestellt , um dieses Problem zu vermeiden. Sie wollen : style.textAlign.

So beantworten Sie die Frage : Verwenden Sie die eckige Klammer : Diesobj.prop ist dasselbe, obj["prop"]damit Sie mithilfe von Zeichenfolgen auf Eigenschaftsnamen zugreifen und Zeichen verwenden können, die in Bezeichnern verboten sind.

QUentin
quelle
2

Die Objekteigenschaftsnamen stimmen nicht eins zu eins mit den CSS-Namen überein.

Doug Chamberlain
quelle
2

Ich denke , im Fall von CSS - Stilen sie in Camelcase Javascript erhalten geändert , so test-alignwird textAlign. Im allgemeinen Fall, in dem Sie auf eine Eigenschaft zugreifen möchten, die nicht standardmäßige Zeichen enthält, verwenden Sie den Array-Stil. ['text-align']

GordonM
quelle
0

Zuerst frage ich mich, warum die Lösung an meinem Ende nicht funktioniert hat

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

... später herausfinden, dass der Zugriff auf Datenattribute anders ist: Es sollte so sein:

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

Hoffe das hilft!

Woppi
quelle