【问题标题】:How to check if a css rule exists如何检查css规则是否存在
【发布时间】:2011-12-19 19:10:27
【问题描述】:

我需要检查是否存在 CSS 规则,因为如果不包含 CSS 文件,我想发出一些警告。

最好的方法是什么?

我可以过滤 window.document.styleSheets.cssRules,但我不确定这是如何跨浏览器的(另外我在 Stack Overflow 上注意到 styleSheet[0] 的对象为空)。

我还希望将依赖项保持在最低限度。

有没有一种简单的方法可以做到这一点?我只需要创建匹配的元素并测试效果吗?

编辑:如果不是,检查window.document.styleSheets的跨浏览器问题是什么?

【问题讨论】:

    标签: javascript css dom cross-browser


    【解决方案1】:

    我不知道这是否适合您,但如果您要检查的是单个文件,那么您可以编写错误消息并切换样式以将其隐藏在该文件中。

    <span class="include_error">Error: CSS was not included!</span>
    

    CSS 文件:

    .include_error {
        display: none;
        visibility: hidden;
    }
    

    【讨论】:

    • 是的,这与我目前的策略相似。我现在能做的最好的事情是.css-file-loaded-marker { z-index: -98256; }$('&lt;p&gt;').addClass('css-file-loaded-marker').css('z-index') == -98256 我不知道这实际上是如何跨浏览器的,所有浏览器都支持这样的z-indicies吗?是否都将 css 应用于分离的元素?
    • 是的,我想是的。 w3schools.com/cssref/pr_pos_z-index.asp 我更喜欢我的解决方案,因为它的开销更少,即使在禁用 JavaScript 或无法加载 jQuery 时也能正常工作。
    • 是的,我认为这是一个很好的解决方案,你得到了我的支持。就我而言,我需要从 JS 中知道,因为我无法控制 html(这是一个 jquery Ui 小部件)
    【解决方案2】:

    我使用 javascript 测试正确的 CSS 安装。

    我的样式表中有一条 CSS 规则,将特定 id 设置为 position: absolute。

    #testObject {position: absolute;}
    

    然后我以编程方式创建一个具有可见性的临时 div:使用该 ID 隐藏并获取计算的样式位置。如果不是absolute,则没有安装所需的CSS。


    如果您不能将自己的规则放入样式表中,那么您可以确定一个或多个您认为代表样式表且不太可能更改的规则,并设计一个应获取这些规则并进行测试的临时对象以这种方式存在。

    或者,最后,您可以尝试枚举所有外部样式表并查找包含的特定文件名。

    这里的重点是,如果您想查看是否包含外部样式表,您必须选择您可以查找的有关该样式表的一些内容(文件名或其中的某些规则或它引起的某些影响)。

    【讨论】:

    • 问题是这个解决方案需要控制css文件。如果你没有那个怎么办?例如,我想测试开发人员是否记得包含第三方小部件所需的 css。我当然可以选择其中的规则之一,但脆弱脆弱脆弱。
    • 您将不得不寻找一些东西!您可以查找具有特定文件名的包含样式表,也可以查找特定规则的存在。选择您要查找的内容。你必须寻找一些东西。我提出了一个建议,但如果需要,您可以查找样式表中已经存在的特定规则。是的,如果实现变化很大,它会有点脆弱,但是你必须寻找一些东西,所以如果整个文件可以改变,那么你必须接受你的检测方法将来可能会中断的可能性。
    • 是的,我不反对寻找规则,但寻找这些规则的效果要脆弱得多,因为你必须平衡“它们不太可能发生的事情”改变”与“不太可能源自其他规则的效果”。如果您可以直接测试规则是否存在,您将消除该等式的一半。
    • @George Mauer - 如果你想直接检查样式表,你可以,尽管跨浏览器有点痛苦。但是,检查对自定义创建的 div 的影响不再脆弱,而且跨浏览器更简单。您创建的 div 仅具有目标 id 或类,如果您没有获得所需的效果,则所需的规则不得处于活动状态。
    【解决方案3】:

    这就是我得到的有效方法。它类似于@Smamatti 和@jfriend00 的答案,但更加充实。我真的希望有一种方法可以直接测试规则,但是哦。

    CSS:

    .my-css-loaded-marker { 
      z-index: -98256; /*just a random number*/
    }
    

    JS:

    $(function () { //Must run on jq ready or $('body') might not exist
    
        var dummyElement = $('<p>')
                      .hide().css({height: 0, width: 0})
                      .addClass("my-css-loaded-marker")
                      .appendTo("body");  //Works without this on firefox for some reason
    
        if (dummyElement.css("z-index") != -98256 && console && console.error) {
            console.error("Could not find my-app.css styles. Application requires my-app.css to be loaded in order to function properly");
        }
        dummyElement.remove();
    });
    

    【讨论】:

    • 哦,该死的,在某些情况下,这在 chrome 上会失败。什么鬼?
    • 总是为我工作(请注意,我使用 d3 来检查样式)。奇怪的。有消息吗?
    • 我最终采取了不同的方法,所以我最近并没有真正尝试这样做,抱歉。
    【解决方案4】:

    我会在您的 jquery 小部件中使用这样的 css 选择器。

    $('link[href$="my-app.css"]')
    

    如果您返回结果,则表示有一个链接元素的 href 以“my-app.css”结尾

    接下来使用此函数来验证您所依赖的元素上的特定 css 属性。我会建议一些特定于你的样式,比如容器的宽度,而不是随机的,比如 -9999 zindex

    var getStyle = function(el, styleProp) {
        var x = !!el.nodeType ? el : document.getElementById(el);
        if (x.currentStyle)
            var y = x.currentStyle[styleProp];
        else if (window.getComputedStyle)
            var y = document.defaultView.getComputedStyle(x, null).getPropertyValue(styleProp);
        return y;
    }
    

    这样

    getStyle($('#stats-container')[0], "width") 
    

    getStyle("stats-container", "width")
    

    【讨论】:

    • 其实是个好主意。到目前为止,该线程中没有提到它,但“只需检查页面上是否存在链接”是一种完全有效的方法。虽然我总是建议提供一个设置来禁止检查,以防 css 被重命名或合并。
    • @GeorgeMauer 如果我正在构建一个依赖于 css 的 js 插件,我会让 js 将链接的 css 动态加载到页面中并在加载时运行回调。这样您就可以控制文件名以及何时加载/可用。
    • 我们在这里讨论细节,但如果我找到一个没有覆盖的组件,我会很生气,因为它打破了结合你的 js 的全部要点
    【解决方案5】:

    如果您担心无法编辑其他人的样式表,您可以通过自己的样式表代理他们,使用import

    @import url('http://his-stylesheet.css');
    .hideErrorMessage{ ... }
    

    如果您只想知道您的代码是否正在尝试加载样式表,这已经足够了,但如果您需要知道是否正确加载了外部样式表,这将无济于事。

    【讨论】:

    • 我不明白,这如何告诉我 his-stylesheet.css 是否已加载?具体问题是我有一个具有 css 依赖项的 jQuery 小部件,如果它们没有加载,我想 console.error 一条消息
    • 这个想法是您将代码中的所有引用从“his-StyleSheet.css”更改为“myProxyStylesheet.css”。正如我最初提到的那样,这在您的情况下可能不是很有用(因为您实际上想要检测外部样式表),但如果您认为问题可能来自于一开始就忘记包含样式表,它会很有用。跨度>
    猜你喜欢
    • 2016-09-10
    • 1970-01-01
    • 2022-11-09
    • 2020-09-09
    • 2019-09-02
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多