javascript – 使用$.each()迭代document.styleSheets时无效的过程调用或参数IE问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 使用$.each()迭代document.styleSheets时无效的过程调用或参数IE问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1721字,纯文字阅读大概需要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;
});
});
});
我得到无效的过程调用或参数错误.当我尝试调试它时,这段代码成功迭代了两个带有规则的CSS样式表文件,但是当第二个迭代完成后,它就失败了.
我似乎无法在此代码中找到错误.
解决方法:
问题
经过彻底的测试后,我发现document.styleSheets不是IE中的常规数组.这就是为什么它在$.each()调用到达结束时中断的原因.
如果我们看看jQuery函数本身,它有一个for循环迭代一个具有length属性的对象,错误地认为它是一个数组. document.styleSheets确实有length属性,但它显然不是数组.所以当执行$.each()中的for循环时:
for (var value = object[0];
i < length && callback.call( value, i, value ) !== false;
value = object[++i]){}
迭代完最后一个元素后它失败了.正如我们可能看到的那样,for循环不会自行增加i,而是在为值赋值时增加它.
我们也可以手动检查.在任何浏览器的地址栏中写下这两行:
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;
});
}
});
内容总结
以上是互联网集市为您收集整理的javascript – 使用$.each()迭代document.styleSheets时无效的过程调用或参数IE问题全部内容,希望文章能够帮你解决javascript – 使用$.each()迭代document.styleSheets时无效的过程调用或参数IE问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。