проблема
После тщательного тестирования я обнаружил, что 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;
});
}
});