ハイフンを含むJavaScriptオブジェクトプロパティを参照するにはどうすればよいですか?


106

このスクリプトを使用し、継承されたすべてのetcスタイルのスタイルオブジェクトを作成します。

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

次のようにすると、最初のアラートは正常に機能しますが、2番目のアラートは機能しません-。文字列ではないので、引用符で囲むことはできません。それでは、このオブジェクトプロパティをどのように使用しますか?


曖昧さと混乱に対処するデイモン(解釈に応じて異なる回答と追加/削除された投票によっても反映されます...):あなたの例でほのめかされ、ほとんどの回答で想定されているCSSプロパティ、またはJSプロパティ、一般的に、タイトルとCSSタグの欠如によって示されますか?[はい、7年になります。:)]
Sz。

@Sz。私は意味any js property、私はそれでハイフンたプロパティの参照に問題が持っていたので(また、CSSプロパティであることを起こった...私は私がやろうとしていたものと別の問題があったことを認識していませんでした)。したがって、2つの異なる問題をカバーするのは奇妙な問題です。しかし、私は上の答えが両方の問題を説明していると思います。
デイモン

回答:


154

編集する

コメントを見ると、CSSプロパティのキー表記は多くのプロパティと互換性がないことがわかります。キャメルケースのキー表記を使用することが現在の方法です

obj.style-attr // would become 

obj["styleAttr"]

ドットではなくキー表記を使用する

style["text-align"]

jsのすべての配列はオブジェクトであり、すべてのオブジェクトは連想配列です。つまり、配列のキーを参照するのと同じように、オブジェクトの場所を参照できます。

arr[0]

またはオブジェクト

obj["method"] == obj.method

この方法でプロパティにアクセスするときに覚えておくべきこと

  1. それらは評価されるので、カウンターで何かを行ったり動的メソッド名を使用したりしない限り、文字列を使用します。

    つまり、obj [method]は未定義のエラーを生成しますが、obj ["method"]は生成しません。

  2. js変数で許可されていない文字を使用している場合は、この表記を使用する必要があります。

この正規表現はほとんどそれを要約します

[a-zA-Z_$][0-9a-zA-Z_$]*

1
ここではキー表記は適用されません-css
ブライアン

どのブラウザ?ハイフンがIE7、IE8、FFX 3.5に入ると失敗します。そして、失敗するとは、それらの両方に対して「未定義」の表示を意味する...
ブライアン

サファリとクロムでテストされた@brianは、赤、赤、中央、中央を表示します。今からffで試してみる
austinbv 2011

@brian面白い、firefox6では機能しなかった、私はそれを知らなかった...毎日何か新しいことを学ぶ
austinbv

1
別のレスポンダーがCSSコレクションがたまたま質問の件名であると指摘して私の反対票を削除しましたが、実際の質問はハイフン付きのプロパティを取得する方法でした。
ブライアン

18

を含むCSSプロパティは、-JavaScriptオブジェクトのcamelCaseで表されます。それは:

alert( style.textAlign );

ブラケット表記を使用して文字列を使用することもできます。

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

プロパティ名には、文字、数字、よく知られた$記号、および_(pimvdbに感謝)のみを含めることができます。


後者は機能します。私が見逃した構文の1つです。私が参照したスクリプトは通常のcssスタイル名を使用していますが、それでも知っておくと役に立ちます!
デイモン

ただし、プロパティ名を数字で始めることはできません
austinbv '19

プロパティ名には、膨大な量のUnicode文字を含めることができます。仕様は問題なく、ブラウザも問題ありません。例:var ò_ó = 'angry';
Camilo Martin

2番目のコードは使用しないでください。CSSプロパティはキャメルケースです。コードは一部のブラウザーで動作する可能性がありますが、標準ではありません。
Oriol

17

元の質問に対する答えは、プロパティ名を引用符で囲み、配列スタイルのインデックスを使用することです。

obj['property-with-hyphens'];

関心のあるプロパティはCSSプロパティであると指摘する人もいます。ハイフンを含むCSSプロパティは、自動的にラクダの大文字に変換されます。その場合は、次のようなキャメルケース名を使用できます。

style.textAlign;

ただし、このソリューションはCSSプロパティでのみ機能します。例えば、

obj['a-b'] = 2;
alert(obj.aB);          // undefined
alert(obj['a-b']);      // 2

2
@Brian CSSのプロパティは正しいです。ただし、元の一般的な質問である「ハイフンを含むJavaScriptオブジェクトプロパティを参照するにはどうすればよいですか?」jsfiddleの更新バージョンは次のとおりです。jsfiddle.net
ストーニー

1
確かに私は自分でここで答えの範囲を狭めました-私はOPが特にオブジェクトをスタイルすることを意味すると仮定しました。質問はそれよりも少し自由回答だったので、私の反対票を削除しました。
ブライアン、

私はあなたが正しいと思います。それはおそらくデイモンが望んだものです。文字通り読みすぎました。
ストーニー、

キャメルケース名を使用する必要あります。できません。
Oriol

9

角かっこを使用します。

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

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

オブジェクトの詳細:MDN

注:スタイルオブジェクトCSSStyleDeclarationにアクセスしている場合、JavaScriptからアクセスするには、キャメルケースを使用する必要があります。詳細はこちら


1
あなたは私をなだめていません-この質問に対する他の多くの回答者によると、あなたはw3c標準をなだめています:w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties。 ..
ブライアン

このコードは使用しないでください。キャメルケースのCSSプロパティがクロスブラウザであるということではありません。キャメルケースの代わりにハイフンを使用することは標準的ではなく、機能しないはずです。
Oriol


4

質問に直接答えるにはstyle['text-align']、ハイフンを含むプロパティをどのように参照するかです。ただし、この場合はstyle.textAlign(またはstyle['textAlign'])を使用する必要があります。


これは使用しないでください。CSSプロパティはキャメルケースです。コードは一部のブラウザーで動作する可能性がありますが、標準ではありません。
Oriol

キャメルケース使用に調整。
Dawson Toth 2016


3

問題を解決するには:この問題を回避するために、キャメルケースでは、ハイフンが含まれるCSSプロパティがJavaScriptプロパティで表されます。あなたが欲しい:style.textAlign

質問に答えるには、角かっこ表記を使用します。これobj.propは、obj["prop"]文字列を使用してプロパティ名にアクセスしたり、識別子で禁止されている文字を使用したりできるのと同じです。



2

CSSスタイルの場合、JavascriptでcamelCaseに変更されるので、にtest-alignなると思いますtextAlign。非標準文字を含むプロパティにアクセスする一般的なケースでは、配列スタイルを使用します。 ['text-align']


0

最初に、なぜ私の解決策が私の側でうまくいかなかったのかと思います

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

...後でデータ属性へのアクセスが異なることを理解する:それは次のようになるはずです:

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

お役に立てれば!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.