2

请记住,我仍在学习 JavaScript,所以请善待。

我有以下代码在网页中搜索包含 HTTP url 的任何 CSS。但是,有一个变量“v”有时可能是未定义的。错误“rule.style 未定义”

我该如何解决这个未定义的响应?我曾尝试使用条件,但没有运气。

var seachHttp = function () {
    var cssSheets = document.styleSheets, // Loaded CSS Sheets
        i =0, il = cssSheets.length, // Counter and limit for sheets
        j, jl, rules, rule, // Counter and vars for Rules inside a Sheet
        stylesToSearch = [ // Properties to Seach HTTP ON
            'background',
            'background-image',
        ],
        k, kl=stylesToSearch.length, // Counter for properties
        s, // Current Property
        v;  // Current Value
    for(;i<il;i++) { // Loop Sheets
        rules = cssSheets[i].rules || cssSheets[i].cssRules;
        for(j=0,jl=rules.length;j<jl;j++) { // Loop Rules
            rule = rules[j];
            for(k=0;k<kl;k++){ // Loop Styles
                s = stylesToSearch[k]; 
                v = rule.style[s]; // Get Value from Current Style
                if ( typeof v !== undefined && v.toString().toLowerCase().indexOf("http") > -1 ) { // Seach for HTTP Content
                    alert("Found HTTP at " + rule.selectorText + " " + s + " = " + rule.style[s]);
                    return true;

                }
            }
        }
    }
    return false;
}

我使用以下方法调用此函数:

var cssresult = seachHttp();
if (cssresult == true && cssresult !== undefined) {
//code here
}
4

1 回答 1

1

由于错误显示“rule.style 未定义”,因此您的错误可能v = rule.style[s]在线上发生,因为您无法在非对象(未定义 [s])上查找属性。

什么时候rule.style未定义?当一个rule对象没有style属性时。

是什么样的对象rule?这是一个CSSRule。(您可以document.styleSheets在 MDN 上自行查找,或者只是console.log(rule)在错误之前添加一个,或者学习使用浏览器的 devtools 调试器)。

正如您从 MDN 页面中看到的,泛型CSSRule没有style属性,只有某种类型 - CSSStyleRule- 有。这是因为除了样式规则(即selector { background: ... })之外,CSS 样式表还可以包含其他结构,例如@media screen { ... },它们本身显然没有任何属性(例如background)。

你应该做什么取决于你的目标是什么:

  • 最简单的解决方案是将此代码限制为 CSSStyleRules 并检查if (rule instanceof CSSStyleRule)rule.type == CSSRule.STYLE_RULE(我当然假设这里是符合标准的浏览器)。
  • 如果您愿意,您可以处理其他类型的规则,例如递归到@media规则中以检查其中定义的样式。不过,这绝对超出了这个答案的范围。
于 2015-08-10T23:42:06.197 回答