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
}
如果可行,只需将代码作为脚本在页面上运行即可,而不是直接从扩展名运行。 –丹达维斯
出于安全原因,不建议这样做,并且如果要发布它,则可能无法通过插件审查。