3

我编写了这段代码,它遍历所有全局样式表规则并将它们存储在数组/对象中。我稍后会使用这个类似字典的对象来更改全局规则,而不是在单个元素上设置样式。

以下代码在 IE8 中中断,但在 Firefox3.7 和 Chrome4 中运行良好。

var allRules;

$(function() {
    var fileRules;
    allRules = [];
    $.each(document.styleSheets, function() {
        // get rules for any browser (IE uses rules array)
        fileRules = this.cssRules || this.rules;
        $.each(fileRules, function() {
            allRules[this.selectorText] = this;
        });
    });
});

我得到Invalid procedure call or argument错误。当我尝试调试它时,这段代码成功地迭代了两个带有规则的 CSS 样式表文件,但是当第二个迭代完成时,它失败了。

我似乎在这段代码中找不到错误。

4

3 回答 3

13

问题

经过彻底的测试,我发现这document.styleSheets不是 IE 中的常规数组。这就是为什么它在$.each()到达终点时中断呼叫。

如果我们看一下 jQuery 函数本身,它有一个for循环来迭代一个具有length属性的对象,错误地认为它是一个数组。document.styleSheets确实有length属性,但它显然不是一个数组。所以当这个for循环$.each()执行时:

for (var value = object[0];
     i < length && callback.call( value, i, value ) !== false;
     value = object[++i]){}

它在最后一个元素被迭代后失败。正如我们可能看到的那样,这个for循环不会自行增加i,而是在为value.

我们也可以手动检查。在任何浏览器的地址栏中写下这两行:

javascript:var a=[1,2,3];alert(a[3]);void(0);
javascript:alert(document.styleSheets[document.styleSheets.length]);void(0);

第一个在所有浏览器中运行良好,但第二个在 IE 中失败。

解决方案

我们必须重写样式表的迭代

var allRules;

$(function() {
    var fileRules;
    allRules = {};
    // can't use $.each() over document.styleSheets because it's not an array in IE
    for (var i = 0; i < document.styleSheets.length; i++)
    {
        fileRules = document.styleSheets[i].cssRules || document.styleSheets[i].rules;
        $.each(fileRules, function() {
            allRules[this.selectorText] = this;
        });
    }
});
于 2010-02-18T17:31:51.100 回答
0

难道是解析规则本身失败了?尝试使用不同的样式表并重新排序规则,以确保由于某种原因解析规则时不会出现问题。

于 2010-02-18T16:35:20.997 回答
-2

真实的代码是:

var fileRules;
(function ($) {
    allRules = {};
    for (var i = 0; i < document.styleSheets.length; i++) {
        fileRules = document.styleSheets[i].cssRules || document.styleSheets[i].rules;
        $.each(fileRules, function () {
            allRules[this.selectorText] = this;
        })(jQuery);
    }
});
于 2011-06-28T04:47:44.980 回答