Как мне сослаться на свойство объекта javascript с дефисом в нем?

106

Использование этого скрипта для создания объекта стиля из всех унаследованных стилей и т. Д.

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

со следующим, первое предупреждение будет работать нормально, а второе - нет ... оно интерпретирует -как минус, я полагаю ... отладчик говорит "ошибка неперехваченной ссылки". Однако я не могу заключить его в кавычки, потому что это не строка. Итак, как мне использовать это свойство объекта?

Дэймон
источник
Дэймон, обращаясь к двусмысленности и путанице (что также отражается в расходящихся ответах и ​​добавленных / удаленных отрицательных голосах в зависимости от интерпретации ...): вы конкретно имели в виду свойства CSS, как указано в вашем примере и предполагается большинством ответов, или любыми свойствами JS , вообще на что указывает название и отсутствие CSSтега? [Да, я знаю, что прошло 7 лет. :)]
Sz.
@Sz. Я имел в виду, any js propertyпотому что у меня возникла проблема со ссылкой на свойство, в котором был дефис (который также оказался свойством css ... я не осознавал, что есть еще одна проблема с тем, что я пытался сделать). Так что это странный вопрос, который в конечном итоге затрагивает две разные проблемы. но я бы сказал, что главный ответ объясняет обе проблемы.
Дэймон

Ответы:

155

РЕДАКТИРОВАТЬ

Посмотрите на комментарии, и вы увидите, что для свойств 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_$]*
austinbv
источник
1
обозначение клавиш здесь не применяется - css определяет стили с использованием верблюжьего регистра в ключах: jsfiddle.net/49vkD
Брайан,
какой браузер? Не получается у меня дефис попадает в IE7, IE8, FFX 3.5. И под ошибками я подразумеваю отображение "undefined" для обоих ...
Брайан
@brian протестирован в Safari, и Chrome отображает красный, красный, центр, центр. Сейчас попробую в ff
austinbv
@brian интересно, не работает в firefox6, я этого не знал ... узнавайте что-то новое каждый день
austinbv
1
Мой отрицательный голос был удален, поскольку другой респондент указал, что коллекция CSS была предметом вопроса hte, но на самом деле вопрос заключался в том, как получить свойство с дефисом.
Брайан
18

Свойства CSS с -символом a представлены в camelCase в объектах Javascript. Это было бы:

alert( style.textAlign );

Вы также можете использовать обозначение скобок для использования строки:

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

Имена свойств могут содержать только символы, числа, общеизвестный $знак и _(спасибо pimvdb).

Дженди
источник
последнее работает ... одна из тех синтаксических вещей, которые я только что упустил. сценарий, на который я ссылался, использует обычные имена стилей css, но все же полезно знать о них!
Дэймон
названия свойств не могут начинаться с цифр
austinbv
Имена свойств могут содержать огромное количество символов Юникода. Это нормально со спецификацией и нормально с браузерами. Например:var ò_ó = 'angry';
Камило Мартин
Не используйте второй код. Свойства 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/49vkD/1
Stoney
1
на самом деле я сузил круг ответов здесь самостоятельно - я предположил, что OP имел в виду именно объекты стиля. Мой голос был удален, так как вопрос был немного более открытым, чем этот.
Брайан
Думаю, вы правы. Вероятно, это то, чего хотел Дэймон. Я прочитал это слишком буквально.
Stoney
Вы должны использовать имя в верблюжьей клетке. Не могу .
Oriol
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 с верблюжьим регистром более кроссбраузерны, дело в том, что использование дефисов вместо верблюжьего регистра нестандартно и не должно работать.
Oriol
4
alert(style.textAlign)

или

alert(style["textAlign"]);
Брайан
источник
4

Чтобы напрямую ответить на вопрос: style['text-align']как бы вы могли ссылаться на свойство с дефисом в нем. Но style.textAlign(или style['textAlign']) - вот что следует использовать в этом случае.

Доусон Тот
источник
Не используйте это. Свойства CSS имеют верблюжий регистр. Ваш код может работать в некоторых браузерах, но не является стандартным.
Oriol
Настроен на использование верблюжьего футляра
Доусон Тот,
3

Чтобы решить вашу проблему : чтобы избежать этой проблемы, свойства CSS с дефисами в них представлены свойствами JavaScript в camelCase . Вы хотите: style.textAlign.

Чтобы ответить на вопрос : Используйте запись в квадратных скобках : obj.propто же самое, что obj["prop"]и для доступа к именам свойств, используя строки и символы, запрещенные в идентификаторах.

Квентин
источник
2

Имена свойств объекта не совпадают однозначно с именами css.

Дуг Чемберлен
источник
2

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

Гордон М.
источник
0

Сначала мне интересно, почему решение не сработало с моей стороны

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

... позже выясним, что доступ к атрибутам данных отличается: он должен быть таким:

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

Надеюсь это поможет!

Воппи
источник