Jak odwołać się do właściwości obiektu javascript z łącznikiem?

106

Użycie tego skryptu do utworzenia obiektu stylu ze wszystkich odziedziczonych stylów itp.

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

z poniższym, pierwszy alert będzie działał dobrze, ale drugi nie. -Zakładam, że interpretuje jako minus .. debugger mówi „nieprzechwycony błąd odniesienia”. Nie mogę jednak umieszczać go w cudzysłowie, ponieważ nie jest to ciąg. Jak więc używać tej właściwości obiektu?

Damon
źródło
Damon, odnosząc się do niejasności i zamieszania (odzwierciedlone również przez rozbieżne odpowiedzi i dodane / usunięte głosy przeciw w zależności od interpretacji ...): czy konkretnie miałeś na myśli właściwości CSS, jak sugeruje twój przykład i zakładane przez większość odpowiedzi, czy jakiekolwiek właściwości JS w ogóle, jak wskazuje tytuł i brak CSStagu? [Tak, wiem, że minęło 7 lat. :)]
Sz.
@Sz. Chodziło mi o to, any js propertyże miałem problem z odwołaniem się do właściwości, która zawierała łącznik (która również była własnością CSS ... nie zdawałem sobie sprawy, że jest inny problem z tym, co próbowałem zrobić). Więc jest to dziwne, które kończy się na omówieniu 2 różnych problemów. ale powiedziałbym, że najlepsza odpowiedź wyjaśnia oba problemy.
Damon

Odpowiedzi:

154

EDYTOWAĆ

Spójrz na komentarze, które zobaczysz, że w przypadku właściwości CSS notacja klucza nie jest zgodna z wieloma właściwościami. Dlatego obecnie stosuje się notację klucza w przypadku wielbłąda

obj.style-attr // would become 

obj["styleAttr"]

Użyj notacji klawiszy zamiast kropki

style["text-align"]

Wszystkie tablice w js są obiektami, a wszystkie obiekty są po prostu tablicami asocjacyjnymi, co oznacza, że ​​możesz odwoływać się do miejsca w obiekcie, tak jak odnosisz się do klucza w tablicy.

arr[0]

lub obiekt

obj["method"] == obj.method

kilka rzeczy, o których należy pamiętać podczas uzyskiwania dostępu do właściwości w ten sposób

  1. są one oceniane, więc używaj łańcuchów, chyba że robisz coś z licznikiem lub używasz dynamicznych nazw metod.

    oznacza to, że obj [metoda] dałoby nieokreślony błąd, podczas gdy obj ["metoda"] nie

  2. Musisz użyć tej notacji, jeśli używasz znaków, które nie są dozwolone w zmiennych js.

To wyrażenie regularne prawie to podsumowuje

[a-zA-Z_$][0-9a-zA-Z_$]*
austinbv
źródło
1
notacja klucza nie ma tutaj zastosowania - css definiuje style przy użyciu wielkości wielbłąda w kluczach: jsfiddle.net/49vkD
Brian
jaka przeglądarka? Nie udaje mi się na myślnik dostaje się w IE7, IE8, FFX 3.5. I, przez niepowodzenia, mam na myśli wyświetlacze „nieokreślone” dla obu tych ...
Brian,
@brian przetestowany w Safari i Chrome wyświetla czerwony, czerwony, środek, środek. Spróbuję teraz w ff
austinbv
@brian ciekawy, nie działał w firefox6, nie wiedziałem, że ... codziennie uczę się czegoś nowego
austinbv
1
Usunąłem mój głos przeciw, ponieważ inny respondent wskazał, że kolekcja CSS była przedmiotem pytania hte, ale tak naprawdę pytanie brzmiało, jak uzyskać dzieloną właściwość.
Brian
18

Właściwości CSS z a -są reprezentowane w camelCase w obiektach Javascript. To byłoby:

alert( style.textAlign );

Możesz również użyć notacji nawiasów, aby użyć ciągu:

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

Nazwy nieruchomości mogą zawierać tylko znaki, cyfry, dobrze znany $znak i _(dzięki pimvdb).

jAndy
źródło
ta ostatnia działa ... jedna z tych syntaktycznych rzeczy, których właśnie przegapiłem. skrypt, do którego się odnosiłem, używa zwykłych nazw stylów css, ale warto o nim wiedzieć!
Damon
nazwy nieruchomości nie mogą jednak zaczynać się od cyfr
austinbv,
Nazwy właściwości mogą zawierać ogromną liczbę znaków Unicode. Jest w porządku ze specyfikacją i w porządku z przeglądarkami. Na przykład:var ò_ó = 'angry';
Camilo Martin
Nie używaj drugiego kodu. Właściwości CSS są otoczone wielbłądem. Twój kod może działać w niektórych przeglądarkach, ale nie jest standardowy.
Oriol
17

Odpowiedź na pierwotne pytanie brzmi: umieść nazwę właściwości w cudzysłowie i użyj indeksowania w stylu tablicy:

obj['property-with-hyphens'];

Kilka osób zwróciło uwagę, że interesująca Cię właściwość to właściwość CSS. Właściwości CSS zawierające łączniki są automatycznie konwertowane na łuskę wielbłąda. W takim przypadku możesz użyć nazwy w postaci wielbłąda, takiej jak:

style.textAlign;

Jednak to rozwiązanie działa tylko dla właściwości CSS. Na przykład,

obj['a-b'] = 2;
alert(obj.aB);          // undefined
alert(obj['a-b']);      // 2
Kamień
źródło
2
@Brian Masz rację jeśli chodzi o właściwości CSS. Jednak odpowiadałem na pierwotne, ogólne pytanie „Jak odwołać się do właściwości obiektu javascript z łącznikiem?” Oto zaktualizowana wersja twojego jsfiddle: jsfiddle.net/49vkD/1
Stoney
1
w istocie sam zawęziłem zakres odpowiedzi - założyłem, że PO oznacza obiekty specyficznie stylizowane. Usunąłem mój głos negatywny, ponieważ pytanie było nieco bardziej otwarte.
Brian
Myślę że masz rację. Tego prawdopodobnie chciał Damon. Przeczytałem to zbyt dosłownie.
Kamień
Państwo musi użyć wielbłąda nazwę powlekanego. Nie mogę .
Oriol
9

Użyj nawiasów:

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

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

Więcej informacji o obiektach: MDN

UWAGA: Jeśli uzyskujesz dostęp do obiektu stylu , CSSStyleDeclaration , użyj must camelCase, aby uzyskać do niego dostęp z poziomu javascript. Więcej informacji tutaj

Joe
źródło
1
Nie uspokajasz mnie - uspokajasz standard w3c, według wielu innych respondentów na to pytanie: w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties , ale tak samo głosowano za pozytywnymi opiniami. ..
Brian
Nie używaj tego kodu. Nie chodzi o to, że właściwości CSS z wielkością wielbłąda są bardziej dostępne w różnych przeglądarkach, chodzi o to, że używanie łączników zamiast wielkości wielbłąda nie jest standardowe i nie powinno działać.
Oriol
4
alert(style.textAlign)

lub

alert(style["textAlign"]);
Brian
źródło
4

Odpowiadając bezpośrednio na pytanie: style['text-align']jak odnosić się do właściwości z łącznikiem. Ale style.textAlign(lub style['textAlign']) jest tym, co powinno być używane w tym przypadku.

Dawson Toth
źródło
Nie używaj tego. Właściwości CSS są otoczone wielbłądem. Twój kod może działać w niektórych przeglądarkach, ale nie jest standardowy.
Oriol
Dopasowany do wielbłąda.
Dawson Toth
2

Nazwy właściwości obiektów nie są dopasowaniami jeden do jednego dla nazw CSS.

Doug Chamberlain
źródło
2

Myślę, że w przypadku stylów CSS oni się przebrać do CamelCase w JavaScript więc test-alignstaje textAlign. W ogólnym przypadku, gdy chcesz uzyskać dostęp do właściwości zawierającej niestandardowe znaki, używasz stylu tablicowego. ['text-align']

Gordon M.
źródło
0

Na początku zastanawiam się, dlaczego rozwiązanie nie zadziałało z mojej strony

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

... później przekonaj się, że dostęp do atrybutów danych przebiega inaczej: powinno wyglądać tak:

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

Mam nadzieję że to pomoże!

Woppi
źródło