하이픈이있는 자바 스크립트 객체 속성을 어떻게 참조합니까?


106

이 스크립트 를 사용 하여 상속 된 모든 스타일의 스타일 객체를 만듭니다.

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

다음을 사용하면 첫 번째 경고는 제대로 작동하지만 두 번째 경고는 작동하지 않습니다. .. -내가 생각하는 마이너스로 해석하고 있습니다. 디버거는 '잡지 않은 참조 오류'라고 말합니다. 하지만 문자열이 아니기 때문에 따옴표를 붙일 수 없습니다. 그렇다면이 객체 속성을 어떻게 사용합니까?


모호함과 혼란을 해결하는 Damon (해석에 따라 다른 답변과 추가 / 제거 된 반대표로도 반영됨 ...) : 귀하의 예제에서 암시하고 대부분의 답변에서 가정 한대로 CSS 속성 또는 JS 속성 을 구체적으로 의미 했습니까? , 일반적으로 제목과 CSS태그 부족으로 표시됩니까? [예, 7 년이 됐다는 걸 알아요. :)]
Sz.

@Sz. 나는 any js property하이픈이있는 속성을 참조하는 데 문제가 있었기 때문에 의미 했습니다 (또한 CSS 속성이기도했습니다 ... 내가하려는 작업에 또 다른 문제가 있다는 것을 몰랐습니다). 따라서 두 가지 다른 문제를 다루는 이상한 문제입니다. 그러나 나는 최고 답변이 두 가지 문제를 모두 설명한다고 말하고 싶습니다.
Damon

답변:


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는 키에 카멜 케이스를 사용하여 스타일을 정의합니다. jsfiddle.net/49vkD
Brian

어떤 브라우저? IE7, IE8, FFX 3.5에서 하이픈을 얻지 못합니다. 그리고 실패하면 두 가지 모두에 대해 "정의되지 않음"이 표시됩니다.
Brian

@brian은 safari에서 테스트했으며 크롬은 빨간색, 빨간색, 중앙, 중앙을 표시합니다. 나는 지금 ff에서 시도 할 것입니다
austinbv 2011-08-19

@ 브라이언 흥미, 내가 뭔가를 새로운 매일 배우 ... 몰랐어 firefox6에서 작동하지 않았다
austinbv

1
다른 응답자가 CSS 수집이 질문의 주제라고 지적함에 따라 내 반대표를 제거했지만 실제 질문은 하이픈으로 연결된 속성을 얻는 방법이었습니다.
Brian

18

가있는 CSS 속성 -은 Javascript 객체의 camelCase로 표시됩니다. 다음과 같습니다.

alert( style.textAlign );

대괄호 표기법을 사용하여 문자열을 사용할 수도 있습니다.

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

속성 이름에는 문자, 숫자, 잘 알려진 $기호 및 _(pimvdb 덕분에) 만 포함될 수 있습니다 .


후자는 작동합니다 .. 내가 놓친 구문적인 것들 중 하나. 내가 참조한 스크립트는 일반 CSS 스타일 이름을 사용하지만 여전히 알아두면 유용합니다!
Damon

속성 이름은 숫자로 시작할 수 없습니다
austinbv 2011-08-19

속성 이름에는 엄청난 양의 유니 코드 문자가 포함될 수 있습니다. 사양은 괜찮고 브라우저에서도 괜찮습니다. 예 :var ò_ó = 'angry';
Camilo Martin

두 번째 코드를 사용하지 마십시오. CSS 속성은 카멜 케이스입니다. 코드는 일부 브라우저에서 작동 할 수 있지만 표준은 아닙니다.
오리올

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/49vkD/1
Stoney

1
실제로 여기에서 답변의 범위를 좁혔습니다. OP가 특히 스타일 객체를 의미한다고 가정했습니다. 질문이 그것보다 조금 더 개방적이어서 내 반대표를 제거했습니다.
Brian

나는 당신이 맞다고 생각합니다. 그것은 아마도 Damon이 원했던 것입니다. 나는 그것을 너무 문자 그대로 읽었습니다.
Stoney

당신은 해야한다 낙타 맡았다 이름을 사용합니다. 하지 수 있습니다 .
오리올

9

대괄호 사용 :

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

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

객체에 대한 추가 정보 : MDN

참고 : 스타일 객체 인 CSSStyleDeclaration 에 액세스하는 경우 must camelCase를 사용하여 javascript에서 액세스하십시오. 여기에 더 많은 정보


1
당신은 저를 달래고 있지 않습니다. w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties라는 질문에 대한 수많은 다른 응답자들에 따라 w3c 표준을 달래고 있습니다. ..
Brian

이 코드를 사용하지 마십시오. 낙타 케이스 CSS 속성이 더 많은 브라우저 간 브라우저가 아니라, 낙타 케이스 대신 하이픈을 사용하는 것이 표준이 아니므로 작동하지 않아야합니다.
오리올


4

질문에 직접 답하려면 style['text-align']하이픈이있는 속성을 참조하는 방법입니다. 그러나 style.textAlign(또는 style['textAlign'])은이 경우에 사용해야합니다.


이것을 사용하지 마십시오. CSS 속성은 카멜 케이스입니다. 코드는 일부 브라우저에서 작동 할 수 있지만 표준은 아닙니다.
오리올

카멜 케이스를 사용하도록 조정되었습니다.
Dawson Toth




2

그래서 그들이 자바 스크립트에서 낙타 표기법으로 변경 얻을 CSS 스타일의 경우 생각 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.