2009-08-13 114 views
3

我们通过标准HTML STYLE标签包含CSS文件。在javascript中跨域访问CSS类

然后,我们需要JavaScript代码来访问CSS类和属性。 在IE和Chrome的一切都很好,但在Firefox它抛出这个异常:

未捕获的异常:安全错误(NS ERROR DOM安全ERR)

这里的javascript代码:

for (var i = 0; i != window.document.styleSheets.length; i++) { 
    rules = window.document.styleSheets.item(i); 
    if(rules.href.indexOf('someurl.com')){ 
     break; 
    } 
} 
return rules.cssRules || rules.rules; 

它在IE,Chrome和Safari中运行良好,但在Firefox和Opera中不起作用。

有什么想法? 由于事先

+2

它似乎在FireFox 3.5中工作。你能发布你使用的所有代码吗?看起来你提供的代码片段是一个功能。你能否提供该函数被调用的地方? – Tres 2009-08-14 02:04:16

+0

无法修复您的JavaScript,但任何机会,你可以写一个处理类(PHP,Java,无论),你打电话与Ajax在本地写入的CSS文件?会照顾浏览器的安全限制。 – Pat 2009-08-14 02:55:09

回答

3

JavaScript可以从任何域引用,但只能对正在执行它的文档的确切域进行更改。确切的域我的意思是从协议到第一个目录必须相同之前的一切。

你不应该能够使用JavaScript来访问不同的域。我不知道为什么这是在IE或Chrome的工作,但它不应该。如果CSS来自不同于执行JavaScript的页面的域,则会引发安全错误。

这里真正的问题是:什么属性是项目?我没有看到你的代码中定义的,我以前没有看到过。你为什么试图用JavaScript来改变样式表,而不是直接将样式更改直接应用到没有引发安全问题的DOM?

+0

也注意到,即使使用链接标签添加本地CSS,只有当它加载了http ...本地文件时才能访问它的样式表//访问将不起作用(至少在chrome上) – kofifus 2015-10-12 04:48:38

0

您可以更改使用JavaScript的风格与此:

elm.style.display = "none"; 

但这些都是只写,看quirksmode getStyles阅读风格。

它可能取决于何时以及如何放置样式,使用@import vs或将样式放置在javascript之后等。某些竞争条件可能会出现,因此可能尝试在window.onload之后获取样式。

+0

对element.style.XXX的引用与单个元素上的<... style =“...”>的HTML等效,它根据级联样式规则优先于该单个元素的所有其他元素。它们不是对样式表(document.styleSheets [N])中指定的样式“规则”的引用,并且不会一次更改多个元素。 – 2012-05-26 23:10:37

0

我想说,你正试图改变它在FF中加载之前的样式。您可以尝试将Javascript调用移到结束标记之前,并在window.onLoad事件上创建该方法,或者如果您使用的是JS库,则该方法是等效的。