13

这是代码:

您会注意到alert(document.styleSheets[x].cssRules.length)失败并带有“安全异常”。任何解决方法。我之所以问,是因为有几个“CSS 延迟加载”类使用此功能来检测是否加载了 CSS 文档。

另外:安全异常是正确的行为/是否符合标准?

4

7 回答 7

7

尝试读取从不同域或服务器加载的样式表或尝试读取 @import 规则时,您可能会收到该错误。

出于您的目的,只需检查 document.styleSheets.length 。

于 2011-03-16T10:20:30.027 回答
5

自 2013 年起,您可以在 <link>-Element 上设置“crossorigin”属性,以向浏览器发出此 CSS 受信任的信号(https://developer.mozilla.org/en-US/docs/Web/HTML/Element /链接)。

之后,您可以通过 Javascript 访问其规则。

于 2013-09-17T14:40:35.627 回答
1

您正在从另一个域加载 css 文件,我猜您不允许为外部加载的 css 文件修改 cssRules。

看到这个:Accessing cross-domain style sheet with .cssRules

于 2011-03-16T10:12:33.053 回答
1

尝试条件:(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

于 2011-03-16T10:17:22.057 回答
1

样式表在那里并且工作正常,您只是无法访问cssRules样式表的属性,因为它被浏览器设置为 null。

您得到的安全错误是由于相同的来源策略 - 您正在处理来自另一个域的样式表,如果样式表托管在您的网页所在的同一域上,您将不会遇到此问题。

于 2011-03-16T10:23:38.950 回答
0

您可以将失败的行放在 try-catch 块中。这就是我在一个项目中解决相同问题的方式。

于 2015-04-23T12:48:50.607 回答
-2

尝试window.document.styleSheets[x].cssRules.length代替document.styleSheets[x].cssRules.length. 它将在没有任何安全异常的情况下在 Firefox 上运行。

于 2015-12-16T13:04:47.247 回答