次のコードは、継続の行でFirefoxコンソールにエラーをスローします。
SecurityError: The operation is insecure.
if( !sheet.cssRules ) { continue; }
ただし、ChromeおよびIE 11 ...にはありません。誰かがこれの-なぜ-を説明できますか?安全です。これはクロスドメインの問題であると思いますが、コードを適切に再作成する方法に行き詰まっています。
var bgColor = getStyleRuleValue('background-color', 'bg_selector');
function getStyleRuleValue(style, selector, sheet) {
var sheets = typeof sheet !== 'undefined' ? [sheet] : document.styleSheets;
for (var i = 0, l = sheets.length; i < l; i++) {
var sheet = sheets[i];
if( !sheet.cssRules ) { continue; }
for (var j = 0, k = sheet.cssRules.length; j < k; j++) {
var rule = sheet.cssRules[j];
if (rule.selectorText && rule.selectorText.split(',').indexOf(selector) !== -1)
return rule.style[style];
}
}
return null;
}
CssRules属性にアクセスしようとしたときにFirefoxでSecurityErrorを回避するには、try/catch
ステートメントを使用する必要があります。以下はうまくいくはずです:
// Example call to process_stylesheet() with StyleSheet object.
process_stylesheet(window.document.styleSheets[0]);
function process_stylesheet(ss) {
// cssRules respects same-Origin policy, as per
// https://code.google.com/p/chromium/issues/detail?id=49001#c10.
try {
// In Chrome, if stylesheet originates from a different domain,
// ss.cssRules simply won't exist. I believe the same is true for IE, but
// I haven't tested it.
//
// In Firefox, if stylesheet originates from a different domain, trying
// to access ss.cssRules will throw a SecurityError. Hence, we must use
// try/catch to detect this condition in Firefox.
if(!ss.cssRules)
return;
} catch(e) {
// Rethrow exception if it's not a SecurityError. Note that SecurityError
// exception is specific to Firefox.
if(e.name !== 'SecurityError')
throw e;
return;
}
// ss.cssRules is available, so proceed with desired operations.
for(var i = 0; i < ss.cssRules.length; i++) {
var rule = ss.cssRules[i];
// Do something with rule
}
}
Firefoxでも同じ問題が発生しました。代わりにこれを試してください。
function getStyle(styleName, className) {
for (var i=0;i<document.styleSheets.length;i++) {
var s = document.styleSheets[i];
var classes = s.rules || s.cssRules
for(var x=0;x<classes.length;x++) {
if(classes[x].selectorText==className) {
return classes[x].style[styleName] ? classes[x].style[styleName] : classes[x].style.getPropertyValue(styleName);
}
}
}
}