最近遇到了两个IE下的兼容问题(产品目前还需要兼容IE8,所以没办法,运行效果虽然不好,但是也仍然兼容着吧)

问题描述:

1, 在更改IE窗口的时候,反应非常慢,甚至卡死

2, 在chrome运行正常,但是在IE8下样式大片失效

分析原因:

问题1: 通过查找, 发现是IE下对 window 的 resize 事件的判断并不是以windows 为准, 而是任何 dom 元素的更改都会触发此事件.

由于项目是基于 reactjs 的组件, 并且会监听 resize 事件从而做出自适应调整.  此调整又会导致 IE 下的 resize 事件, 从而, 死循环 诞生.

问题2: 感觉不是兼容问题导致的, 因为很多的样式失效. 组内一哥们经过"深入"钻研,  发现更改总 less 文件的 import 会部分解决此问题,

但仍然会导致其他模块的样式更改. 我一起参与分析后, 发现样式在IE下就像丢失一样, 不仅仅是兼容问题. 经过查找, 发现在IE9下的css rule

有长度限制(单个文件, 即单个CSS 文件限制rule数量为 4096. 此处做一个自己的说明, 此处的 rule , 即为一条 css 规则, 如果有逗号的多个

写在一行的规则, 是会计算为多个规则的~~~~) 所以单纯的抽离出来CSS样式, 写为一行是不可以的. 虽然代码量减少, 但是rule 数量并没有

减少多少. 需要对样式进行公共性归纳, 处理, 调整CSS的规则.

问题解决:

1: 通过在 resize 事件的时候 增加判断窗口大小是否更改进行解决

示例方法如下:

//so的搬运工 ^_^
var winWidth = $(window).width(),
winHeight = $(window).height(); $(window).resize(function(){
var onResize = function(){
//The method which alter some css properties triggers
//window.resize again and it ends in an infinite loop
someMethod();
} //New height and width
var winNewWidth = $(window).width(),
winNewHeight = $(window).height(); // compare the new height and width with old one
if(winWidth!=winNewWidth || winHeight!=winNewHeight){
window.clearTimeout(resizeTimeout);
resizeTimeout = window.setTimeout(onResize, 10);
}
//Update the width and height
winWidth = winNewWidth;
winHeight = winNewHeight;
});

  

2: 通过精简css rule进行处理. 判断有多少rule的js(在非IE下运行~~)

function countCSSRules() {
var results = '',
log = '';
if (!document.styleSheets) {
return;
}
for (var i = 0; i < document.styleSheets.length; i++) {
countSheet(document.styleSheets[i]);
}
function countSheet(sheet) {
if (sheet && sheet.cssRules) {
var count = countSelectors(sheet); log += '\nFile: ' + (sheet.href ? sheet.href : 'inline <style> tag');
log += '\nRules: ' + sheet.cssRules.length;
log += '\nSelectors: ' + count;
log += '\n--------------------------';
if (count >= 4096) {
results += '\n********************************\nWARNING:\n There are ' + count + ' CSS rules in the stylesheet ' + sheet.href + ' - IE will ignore the last ' + (count - 4096) + ' rules!\n';
}
}
}
function countSelectors(group) {
var count = 0
for (var j = 0, l = group.cssRules.length; j < l; j++) {
var rule = group.cssRules[j];
if (rule instanceof CSSImportRule) {
countSheet(rule.styleSheet);
}
if (rule instanceof CSSMediaRule) {
count += countSelectors(rule);
}
if( !rule.selectorText ) {
continue;
}
count += rule.selectorText.split(',').length;
}
return count;
} console.log(log);
console.log(results);
};
countCSSRules();

  

OK, 完毕. 附上自己参考的地址. 对于前端来说 stackoverflow 的确是好地方, 要经常去查找看看. 这是一个认真做事的地方.

http://stackoverflow.com/questions/1852751/window-resize-event-firing-in-internet-explorer

http://stackoverflow.com/questions/9906794/internet-explorers-css-rules-limits

最近遇到的两个IE下的问题(IE兼容问题)的更多相关文章

  1. CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking)

    CSharpGL(18)分别处理glDrawArrays()和glDrawElements()两种方式下的拾取(ColorCodedPicking) 我在(Modern OpenGL用Shader拾取 ...

  2. Android锁屏或灭屏状态下,快速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)

        如前一篇博文所分析,我们可以使用广播的形式在快速按下两次音量下键的时候发出广播,以方便客户端进行捕捉.既然有两种方式可以实现该Issue那么哪种方式是首选呢?     我个人推荐使用启动服务的 ...

  3. Atitit 如何创新 创新只有在两种条件下发生:自由、效率。

    Atitit 如何创新 创新只有在两种条件下发生:自由.效率. 创新是如何发生的呢? 创新只有在两种条件下发生:自由.效率.在自由的环境下,对效率的追逐等于创新.如果你不自由,你的思想不够开阔,你脑洞 ...

  4. 一个diff工具,用于判断两个目录下所有的改动(比较新旧版本文件夹)

    需求: 编写一个diff工具,用于判断两个目录下所有的改动 详细介绍: 有A和B两个目录,目录所在位置及层级均不确定 需要以B为基准找出两个目录中所有有改动的文件(文件或内容增加.修改.删除),将有改 ...

  5. Shell 实现找出两个目录下的同名文件方法

    # 首先我们来创建一些 2 个目录,里面的目录结构及相关文件如下所示: # 从上面的测试目录可以看到, lol.txt lol2.txt 两个文件是两个目录下的同名文件 # 有实际例子,思路就容易出来 ...

  6. Android锁屏或灭屏状态下,高速按两次音量下键实现抓拍功能(1.2Framework层使用startService形式实现)

        如前一篇博文所分析.我们能够使用广播的形式在高速按下两次音量下键的时候发出广播,以方便client进行捕捉. 既然有两种方式能够实现该Issue那么哪种方式是首选呢?     我个人推荐使用启 ...

  7. StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程【转载】

    StoryBoard不使用AutoLayout情况下 按比例快速兼容适配iPhone6/6 Plus教程[转] 声明:本文章是为了后期快速兼容6和6Plus的按比例放大方法,对于部分读者来说可能觉得该 ...

  8. http与websocket(基于SignalR)两种协议下的跨域基于ASP.NET MVC--竹子整理

    这段时间,项目涉及到移动端,这就不可避免的涉及到了跨域的问题.这是本人第一次接触跨域,有些地方的配置是有点麻烦,导致一开始的不顺. 至于websocket具体是什么意义,用途如何:请百度. 简单说就是 ...

  9. win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏

    扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(目前我是不知道) 但可以下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...

随机推荐

  1. IOS 本地通知 UILocalNotification

    IOS 本地通知 UILocalNotification [本文章第四部分中的代码逻辑来自网上的借鉴,并非我自己原创] 大概一个月前,我开始跟着做IOS项目了.学习C++,了解Objective-C, ...

  2. java.lang.NoClassDefFoundError: com.umeng.analytics.MobclickAgent

    07-24 09:58:23.239: E/AndroidRuntime(29487): FATAL EXCEPTION: main 07-24 09:58:23.239: E/AndroidRunt ...

  3. Android ListView中添加不同的多种布局

    最近做项目要使用ListView加载不同的布局,由于自己写的代码不能贴出,故找了一篇自认为比较好的blog给分享出来,希望对用到此项技术的同学有点帮助. http://logc.at/2011/10/ ...

  4. [COM/ATL]组件、对象、MFC、ATL的区别

    组件(Component)和对象(Object)之间的区别 先明确组件(Component)和对象(Object)之间的区别.组件是一个可重用的模块,它是由一 组处理过程.数据封装和用户接口组成的业务 ...

  5. 2440裸机驱动之PWM开发

    原文http://blog.chinaunix.net/uid-14114479-id-3125685.html ARM驱动蜂鸣器的方式有两种:一种是PWM输出口直接驱动,另一种是利用IO定时翻转电平 ...

  6. poj1475Pushing Boxes

    N - Pushing Boxes Time Limit:2000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u ...

  7. Cocos2d-精灵的几个常识

    性能考虑 该部分是总结的cocos2d的在线文档 1)如果有每个帧有25个以下的精灵需要更新,可以直接使用精灵 class TLayer(cocos.layer.Layer):     is_even ...

  8. memcached缓存技术

    初学memcached缓存技术,如果文章写得不好还请谅解 应用环境:win7 实现环境:cmd,eclipse Memcached简洁而强大.它的简洁设计便于快速开发,减轻开发难度,解决了大数据量缓存 ...

  9. mac 显示隐藏文件方法

    终端执行命令: 显示:#defaults write com.apple.finder AppleShowAllFiles -bool true隐藏:#defaults write com.apple ...

  10. Struts1和Struts2的区别和对比

    Struts1和Struts2的区别和对比: Action 类: • Struts1要求Action类继承一个抽象基类.Struts1的一个普遍问题是使用抽象类编程而不是接口. • Struts 2  ...