Могу ли я получить значение нестандартного свойства CSS через Javascript?

Я пытаюсь прочитать настраиваемое (нестандартное) свойство CSS, заданное в таблице стилей (а не атрибут встроенного стиля), и получить его значение. Возьмем, к примеру, этот CSS:

#someElement {
  foo: 'bar';
}

Мне удалось получить его значение с помощью свойства currentStyle в IE7:

var element = document.getElementById('someElement');
var val = element.currentStyle.foo;

Но currentStyle зависит от MS. Итак, я попробовал getComputedStyle () в Firefox 3 и Safari 3:

var val = getComputedStyle(element,null).foo;

... и возвращает undefined. Кто-нибудь знает кроссбраузерный способ получения пользовательского значения свойства CSS?

(Как вы могли заметить, это недопустимый CSS. Но он должен работать, пока значение соответствует правильному синтаксису. Лучшее имя свойства было бы «-myNameSpace-foo» или что-то в этом роде.)

Я заинтересован; Какую проблему ты пытаешься решить? :)

cllpse 30.10.2008 15:27

То же самое! Вроде очень странная просьба ...

Rob Stevenson-Leggett 30.10.2008 15:42

Я подумал, что было бы неплохо перенести настройки, связанные со стилем, для материалов, отличных от HTML (например, Flash, Silverlight или JS), в обычных таблицах стилей, а затем передать их, например, Прошить через JS. В большой среде, где сложный контент должен управляться только с помощью таблиц стилей, это может быть полезно.

joolss 30.10.2008 15:51

Я не уверен, возможно ли это. Я заметил, что firebug полностью игнорирует стили, которые не распознает. Это может означать, что Firefox сам проигнорирует их при анализе таблицы стилей. Конечно, я мог ошибаться.

pkaeding 30.10.2008 15:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
14
4
2 130
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Firefox не переносит теги, атрибуты или стили CSS, которые он не понимает, из кода в DOM. Это задумано. Javascript имеет доступ только к DOM, но не к коду. Так что нет, нет возможности получить доступ к свойству из javascript, которое сам браузер не поддерживает.

Это не совсем так. Firefox не создает свойства DOM для нестандартных атрибутов HTML, но они доступны через getAttribute.

RobG 27.06.2012 03:03

Читая информацию о таблице стилей в IE, вы МОЖЕТЕ получить эти «фиктивные» свойства, но только в IE, о котором я знаю.

var firstSS = document.styleSheets[0];
var firstSSRule = firstSS.rules[0];
if (typeof(firstSSRule.style.bar) != 'undefined'){
  alert('value of [foo] is: ' + firstSSRule.style.bar);
} else {
  alert('does not have [foo] property');
}

Его уродливый код, но вы понимаете.

Хороший трюк! Мой пример выше также отлично работает в IE, но больше нигде (см. CurrentStyle в quirksmode.org/dom/w3c_css.html), хотя ему нужен элемент, соответствующий селектору (способ CSS). Одним из способов было бы проанализировать таблицу стилей с помощью Javascript. Хотя это не кажется практичным.

joolss 08.11.2008 19:36

Один из способов, конечно, - написать собственный CSS-парсер на Javascript. Но я считаю, что это В самом деле чрезмерно.

Определенно чрезмерно, но это полезный совет в безвыходных ситуациях :).

Daniel Cassidy 20.01.2009 20:58

У меня тоже есть несколько страниц, которые прекрасно работают в MSIE, но содержат много информации в стилях и таблицах стилей. Итак, я думаю об обходных путях. К счастью, Firefox позволяет помещать встроенные атрибуты в DOM. Итак, вот частичная стратегия:

  1. Замените каждый встроенный стиль в html-документе соответствующим «nStyle», например, <span class = "cls1" nStyle = "color: red; nref: #myid; foo: bar"> ... </span>

  2. Когда страница загружена, выполните следующие действия с каждым узлом элемента: (a) скопируйте значение атрибута nStyle в тег cssText и в то же время (b) преобразуйте нестандартные атрибуты в более простой формат, чтобы, например, , node.getAttribute ('nStyle') становится объектом {"nref": "# myid", "foo": "bar"}.

  3. Напишите функцию «CalculatedStyle», которая получает либо стиль, либо nStyle, в зависимости от того, что доступно.

Написание грубого синтаксического анализатора для таблиц стилей может позволить использовать для них аналогичную стратегию, но у меня есть вопрос: как мне преодолеть препятствие, связанное с чтением таблицы стилей без цензуры со стороны Firefox?

Современные браузеры просто выбрасывают недопустимые css. Однако вы можете использовать свойство content, поскольку оно действует только с :after, :before и т. д. Вы можете хранить в нем JSON:

#someElement {
    content: '{"foo": "bar"}';
}

Затем используйте такой код, чтобы получить его:

var CSSMetaData = function() {

    function trimQuotes( str ) {
         return str.replace( /^['"]/, "" ).replace( /["']$/, "" );   
    }

    function fixFirefoxEscape( str ) {
        return str.replace( /\\"/g, '"' );
    }

    var forEach = [].forEach,
        div = document.createElement("div"),
        matchesSelector = div.webkitMatchesSelector ||
                          div.mozMatchesSelector ||
                          div.msMatchesSelector ||
                          div.oMatchesSelector ||
                          div.matchesSelector,
        data = {};

    forEach.call( document.styleSheets, function( styleSheet ) {
        forEach.call( styleSheet.cssRules, function( rule ) {
            var content = rule.style.getPropertyValue( "content" ),
                obj;

            if ( content ) {
                content = trimQuotes(content);
                try {
                   obj = JSON.parse( content );
                }
                catch(e) {
                    try {

                        obj = JSON.parse( fixFirefoxEscape( content ) );
                    }
                    catch(e2) {
                        return ;
                    }

                }
                data[rule.selectorText] = obj;
            }
        });

    });


    return {

        getDataByElement: function( elem ) {
            var storedData;
            for( var selector in data ) {
                if ( matchesSelector.call( elem, selector ) ) {
                    storedData = data[selector];
                    if ( storedData ) return storedData;

                }
            }

            return null;
        }
    };

}();
var obj = CSSMetaData.getDataByElement( document.getElementById("someElement"));
console.info( obj.foo ); //bar

Обратите внимание, это только для современных браузеров. Демо: http://jsfiddle.net/xFjZp/3/

Не работает с Opera, которая применяет свойство содержимого не только к псевдоэлементам - вместо фактического содержимого отображается JSON.

Bergi 25.07.2012 22:43

@Bergi да, но тогда это ошибка. См. Спецификацию w3.org/TR/CSS21/generate.html#content

Esailija 26.07.2012 10:58

Хорошо, я подал отчет :-) Тем не менее, официальный тест подходит для обоих вариантов поведения ...

Bergi 26.07.2012 11:27

Может, можно попробовать с МЕНЬШЕ. Это язык динамических таблиц стилей, и вы можете создавать нестандартные атрибуты CSS, команды, которые будут скомпилированы позже.

Другие вопросы по теме