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, 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_$]*

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).


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

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


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

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.


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

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']


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!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.