Firefox не может перечислить document.styleSheets []. CssRules []

Вот код:

Вы заметите, что alert(document.styleSheets[x].cssRules.length) завершается с "исключением безопасности". Любое обходное решение для этого. Я спрашиваю, потому что есть несколько классов "ленивой загрузки CSS", которые используют эту функцию для определения того, загружен ли документ CSS.

Также: является ли исключение безопасности правильным поведением/соответствует стандартам?

Ответ 1

Вы можете получить эту ошибку при попытке прочитать таблицу стилей, загруженную из другого домена или сервера, или попытаться прочитать правило @import.

Для вашей цели просто проверьте document.styleSheets.length.

Ответ 2

С 2013 года вы можете установить атрибут "crossorigin" в <link> -Element, чтобы сигнализировать браузеру, что этот CSS доверен (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/link).

После этого вы можете получить доступ к своим правилам через Javascript.

Ответ 4

Попробуйте с условием: (обходной путь IE)

function aftermath(index) {
    var css = document.styleSheets[index].rules || document.styleSheets[index].cssRules;
    alert(css.length);
}

Это дает ошибку:

aftermath(document.styleSheets.length - 1);

Если я устанавливаю его на 0, все работает нормально... Проблема в том, что css не готов в это время, если вам нужно получить доступ это, вы должны сделать это во второй момент

Последнее редактирование:

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

<?php
$name = 'http://ajax.googleapis.com/ajax/libs/jqueryui/$_GET[version]/themes/$_GET[theme]/jquery-ui.css';
$fp = fopen($name, 'rb');
fpassthru($fp);
exit;
?>

Затем вы можете получить его, используя, например, /proxy.php?version=1.7.0&theme=humanity

Ответ 5

Таблица стилей существует и работает нормально, вы просто не можете получить доступ к свойству cssRules таблицы стилей, потому что она установлена ​​в браузере нулевым значением.

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

Ответ 6

Вы можете поместить линию сбоя в блок try-catch. Вот как я решил одну и ту же проблему в одном проекте.

Ответ 7

Попробуйте window.document.styleSheets[x].cssRules.length вместо document.styleSheets[x].cssRules.length. Он будет работать на firefox без каких-либо исключений безопасности.