CSSRule DOM interface包含与每种CSS规则类型相对应的常量。可以使用以下语句测试规则的类型

someRule.type == CSSRule.STYLE_RULE


我正在使用SDK构建Firefox插件。从此加载项的内容脚本文件中读取时,CSSRule存在,但为空。

console.log("CSSRule is " + CSSRule);
for(var key in CSSRule) {
    console.log('key: ' + key + '\n' + 'value: ' + CSSRule[key]);
}
console.log("CSSRule.STYLE_RULE is " + CSSRule.STYLE_RULE);


输出

CSSRule is [object CSSRule]
CSSRule.STYLE_RULE is undefined


从页面内的script或Firefox控制台执行相同操作时,输出与我期望的一样,且CSSRule.STYLE_RULE设置为1

从pageMod contentScript而不是外部内容脚本文件执行时,CSSRule改为{}

等待页面完成加载,并使用window.CSSRule代替CSSRule,请勿更改行为。

我已经在OS 45的Firefox 45.0.1(当前版本)和今天晚上的版本(48.01a 2016-04-10)上对此进行了测试。

为什么CSSRule为空?除了手动将其设置为正确的值之外,我如何访问这些常量?

最佳答案

这是bug 898764。扩展脚本在提供内容xray vision的沙箱中运行。

这意味着不可见的Web内容定义的属性是不可见的,但是所有IDL定义的属性和常量的原始实例都应该是可见的。

目前,以下方法可以作为一种解决方法,但是会将您的代码暴露于可能被内容更改或删除的值:

if(!("STYLE_RULE" in CSSRule)) {
   window.CSSRule = unsafeWindow.CSSRule
}



  如果可行,只需将代码作为脚本在页面上运行即可,而不是直接从扩展名运行。 –丹达维斯


出于安全原因,不建议这样做,并且如果要发布它,则可能无法通过插件审查。

09-25 10:47