Як я можу посилатись на властивість об’єкта javascript із дефісом у ньому?


106

Використовуючи цей скрипт, щоб створити об'єкт стилю для всіх успадкованих тощо стилів.

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

з наступним, перше сповіщення буде добре працювати, але друге - не .. воно трактує -як мінус, я припускаю .. налагоджувач говорить "помилка невловимого посилання". Я не можу ставити цитати навколо нього, тому що це не рядок. Тож як я можу використовувати цю властивість об’єкта?


Демон, звертаючись до неоднозначності та плутанини (відображається також розбіжними відповідями та доданими / видаленими зворотними записами залежно від інтерпретації ...): ви конкретно мали на увазі властивості CSS, як натякає ваш приклад та припускає більшість відповідей, або будь-які властивості JS загалом, на що вказує заголовок та відсутність CSSтегу? [Так, я знаю, що минуло 7 років. :)]
Sz.

@Sz. Я мав на увазі, any js propertyтому що у мене виникли проблеми з посиланням на властивість, яка мала дефіс (що також трапилось у властивості css ... Я не розумів, що є інша проблема з тим, що я намагався зробити). Тож це дивно, яке в кінці кінців охоплює 2 різні питання. але я б сказав, що головна відповідь пояснює обидва питання.
Деймон

Відповіді:


154

EDIT

Погляньте на коментарі, ви побачите, що для css властивостей позначення ключів не сумісні з низкою властивостей. Тому використання ключових позначень корпусу верблюда є поточним способом

obj.style-attr // would become 

obj["styleAttr"]

Використовуйте ключові позначення, а не крапки

style["text-align"]

Усі масиви в js - це об'єкти, а всі об'єкти - це просто асоціативні масиви, це означає, що ви можете посилатися на місце в об’єкті так само, як ви б посилалися на ключ у масиві.

arr[0]

або об’єкт

obj["method"] == obj.method

кілька речей, які слід пам’ятати, отримуючи доступ до властивостей таким чином

  1. вони оцінюються, тому використовуйте рядки, якщо ви не робите щось із лічильником або використовуєте імена динамічних методів.

    це означає, що obj [метод] дасть вам невизначену помилку, тоді як obj ["метод"] не буде

  2. Ви повинні використовувати це позначення, якщо ви використовуєте символи, які не дозволені у js-змінних.

Цей регекс в значній мірі підсумовує його

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

1
позначення ключових слів
Брайан

який браузер? Збій для мене на дефісі потрапляє в IE7, IE8, FFX 3.5. І, не вдається, я маю на увазі відображення "невизначених" для обох цих ...
Брайан

@brian тестується на сафарі та хромі, відображає червоний, червоний, центр, центр. Я спробую в ff зараз
austinbv

@brian цікаво, не працював у firefox6, я цього не знав ... щодня дізнайся щось нове
austinbv

1
Як видалився інший респондент, я видалив, що колекція CSS сталася предметом hte-питання, але власне питання полягав у тому, як отримати дефіс.
Брайан

18

Властивості CSS з a -представлені в camelCase в об'єктах Javascript. Це було б:

alert( style.textAlign );

Ви також можете використовувати позначення дужок, щоб використовувати рядок:

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

Імена властивостей можуть містити лише символи, цифри, добре відомий $знак та _(завдяки pimvdb).


остання працює .. одна з тих синтаксичних речей, які я щойно пропустив. сценарій, на який я посилався, використовує звичайні назви стилів css, але все ще корисно знати про це!
Деймон

Назви властивостей не можуть починатися з цифр
austinbv

Імена властивостей можуть містити значну кількість символів Unicode. З технікою все нормально, і з браузерами все нормально. Наприклад:var ò_ó = 'angry';
Каміло Мартін

Не використовуйте другий код. Властивості 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
дійсно, я самостійно звузив обсяг відповідей - я припустив, що ОП означає конкретно стильові об'єкти. Зняв моє голосування, оскільки питання було дещо відкритішим, ніж це.
Брайан

Я думаю, ти прав. Саме цього, мабуть, хотів і Деймон. Я читав це занадто буквально.
Стоні

Ви повинні використовувати ім'я з верблюдом. Не може .
Оріол

9

Використовуйте дужки:

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

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

Більше інформації про об'єкти: MDN

ПРИМІТКА. Якщо ви отримуєте доступ до об'єкта стилю , CSSStyleDeclaration , використовуйте must camelCase для доступу до нього з javascript. Більше інформації тут


1
Ви мене не вподобаєте - ви посилаєтесь на стандарт w3c, згідно з численними іншими відповідями на це запитання: w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSS2Properties , але підтримуєте саме те саме. ..
Брайан

Не використовуйте цей код. Справа не в тому, що CSS-властивості, які перебувають на верблюдах, є більш крос-браузером, це те, що використання дефісів замість корпусу верблюда не є стандартним і не повинно працювати.
Оріол


4

Безпосередньо відповісти на питання: style['text-align']як ви посилаєтесь на властивість із дефісом у ньому. Але style.textAlign(або style['textAlign']) - це те, що слід використовувати в цьому випадку.


Не використовуйте це. Властивості CSS визначаються на основі верблюда. Ваш код може працювати в деяких браузерах, але не є стандартним.
Оріол

Пристосований до використання корпусу верблюда.
Доусон Тот


3

Щоб вирішити вашу проблему : Властивості CSS з дефісами в них представлені властивостями JavaScript у camelCase, щоб уникнути цієї проблеми. Ви хочете: style.textAlign.

Щоб відповісти на питання : Використовуйте позначення квадратної дужки : obj.propте саме, що obj["prop"]ви можете отримати доступ до імен властивостей за допомогою рядків та використовувати символи, заборонені в ідентифікаторах.



2

Я думаю , що в разі стилів CSS вони переодягнутися до верблюжому в Javascript так test-alignстають textAlign. У загальному випадку, коли ви хочете отримати доступ до властивості, яка містить нестандартні символи, ви використовуєте стиль масиву. ['text-align']


0

Спочатку мені цікаво, чому рішення не спрацювало на моєму кінці

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

... згодом з’ясуємо, що доступ до атрибутів даних відрізняється: він повинен бути таким:

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

Сподіваюся, це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.