Похоже, вы хорошо поработали над этим.Это невозможно, если получить доступ к объекту CSSStyleDeclaration
или CSSRuleList
, так как отфильтрованы неопознанные свойства, что является ошибкой реализации в большинстве основных браузеров, поскольку они должны перечислять все свойства, даже те, которые они не понимают.См. связанный вопрос для получения дополнительной информации по этому вопросу.
Остальные альтернативы требуют слишком большой работы, как уже упоминал @Sarfaraz.Все сводится к разбору всего вручную и повторному выполнению работы, которую браузеры уже сделали для нас.Если предположить, что ваши объявления стилей встроены, либо в тегах <style>
, либо в качестве атрибута стиля элемента, то вам придется проанализировать текст и построить карту всех интересных свойств CSS3.С inline-атрибутом он в основном разбирает текст, похожий на:
`prop1: value; prop2: value2; ..`
См. Ответ @Nick Craver на похожий вопрос , где он сделал ссылку на подход регулярных выражений для выполнения этого.
При использовании встроенных тегов анализируемый текст будет иметь вид:
[selector] {
prop1: value1;
prop2: value2;
...
}
...
Это упрощение, игнорирующее все правила создания грамматики, и существует множество проблем, которые необходимо обработать.здесь.
Если таблицы стилей являются внешними, и на них есть ссылки внутри страницы, вам придется искать элементы <link>
, имеющие атрибут rel
, равный "stylesheet"
, и получать их href
имущество.Также проанализируйте URL для импортированных таблиц стилей.Получив эти URL-адреса, вы можете сделать AJAX-вызов для извлечения фактического содержимого этих таблиц стилей, предполагая, что ничто не блокирует вызов на стороне сервера.Когда у вас есть текст из каждого файла, это в основном шаг синтаксического анализа, аналогичный описанному выше, и добавление необходимых правил с использованием insertRule
или addRule
в зависимости от браузера.
Могут быть парсеры CSS с открытым исходным кодом, которыеможет помочь вам в этом.
Это может быть длинным способом сказать, что я думаю, что решение @ jrista довольно хорошее.Если вы не хотите писать все перестановки кода, специфичного для поставщика, то более простым и лучшим подходом будет иметь слой генерации CSS, который является частью какого-то процесса сборки, который генерирует все перестановки и выплевывает файлы CSS.
Этот слой также может содержать оптимизации, проверяя заголовок User-Agent
и генерируя только требуемые стили, что, по сути, и делает GWT (но он генерирует все возможные перестановки заранее, вместо того, чтобы делать это во время выполнения).
Это может быть серьезным мероприятием, поэтому в конце дня вы должны оценить свои варианты и посмотреть, перевешивает ли усилие по достижению чистоты кода преимущества небольшой избыточности.