【问题标题】:Firefox and IE can't modify cssRulesFirefox 和 IE 无法修改 cssRules
【发布时间】:2016-11-26 15:23:44
【问题描述】:

我需要更改现有的全局 CSS 规则,然后访问 document.styleSheets,获取我的规则并对其进行修改。

我通过访问 selectorText 属性来修改选择器。

CSS 代码

<style type="text/css">
    .class {
        color: #230020;
    }
</style>

JavaScript 代码

var rule = document.styleSheets[0].cssRules[0]; // obtain the first rule.

/* Chrome, Opera, Safari */
rule.selectorText; // returns ".class"
rule.selectorText = ".another-class";
rule.selectorText; // returns ".another-class", then it works and the rule changed.

我的问题是在所有版本的 Firefox 和 Internet Explorer 中,属性 selectorText 似乎是只读的。

/* Internet Explorer, Edge, and Firefox */
rule.selectorText; // returns ".class"
rule.selectorText = ".another-class";
rule.selectorText; // returns ".class", It remains as it was.

如何让它在 Mozilla Firefox、Microsoft Internet Explorer 和 Edge 上运行?

【问题讨论】:

    标签: javascript css internet-explorer firefox cross-browser


    【解决方案1】:

    根据MDN,selectorText 是只读的:

    CSSRule.selectorText 属性获取规则集选择器的文本表示。这是以只读方式实现的;要动态设置样式表规则,请参阅使用动态样式信息。

    不幸的是,似乎没有跨浏览器的方式来更改 CSS 规则的选择器。如果这是您的目标,您可以尝试删除整个规则并使用相同的规则索引将其替换为新规则,您只需包含所有规则属性以及选择器,如下所示:

    var cssText = document.styleSheets[1].cssRules[0].style.cssText;
    document.styleSheets[0].deleteRule(0);
    document.styleSheets[0].insertRule('.another-class { ' + cssText + ' }', 0);
    

    适用于 Firefox 和其他浏览器。请参阅insertRule() 和deleteRule()。

    【讨论】:

    • 我已经更新了我的答案,向您展示如何缓存原始样式属性,这样您就不必重新编写它们。
    • 这不准确 - 检查spec。 FF 错误仍然存​​在,尽管据称它确实在 IE 中工作但有一些警告。我已经更正了 MDN 文章。
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 2019-02-15
    • 2016-08-14
    • 2015-03-06
    • 1970-01-01
    • 2015-01-20
    • 2015-10-01
    • 1970-01-01
    相关资源
    最近更新 更多