IE兼容BUG汇总及解决方案(持续更新)
本篇为总结开发过程当中遇到的各种IE兼容性的小问题,比较复杂的会单开一篇文章来讲解。
另:我手头目前只有原生IE8,原生IE9,原生IE11,以及IE11模拟的IE5,7,8,9,10。因IE6太过古老而不再进行测试。
无法使用jquery的outerHTML的方式创建含有href属性的a标签(IE5-8)
问题复现:
typeof $("").get(0);//IE7-8:"undefined" typeof $("").get(0);//标准浏览器:"object"
影响浏览器:
测试 | 模拟IE5 | 模拟IE7 | 模拟IE8 | 原生IE8 | 模拟IE9 | 原生IE9 | 模拟IE10 | 原生IE11 |
---|---|---|---|---|---|---|---|---|
!!$("").get(0) | N | N | N | N | Y | Y | Y | Y |
!!$("").attr("href","x").get(0) | Y | Y | Y | Y | Y | Y | Y | Y |
解决方案:
typeof $("").attr("href","xxx").get(0);//IE8 "object"
使用Date对象来构造新Date对象导致毫秒值丢失(所有IE,火狐)
详见——FireFox和IE下使用Date来构造新Date对象的BUG
IE下console对象报错
详见——让IE兼容console——“由于出现错误80020101而导致此项操作无法完成”的解决方案
IE8下congsole.log的typeof为object
详见——IE8下的typeof(console.log)为"object"的BUG
IE8下Event.button的值与标准浏览器不一致
IE8以下的所有鼠标事件(mousedown,mouseup,click等)的event.button的值与标准浏览器不符,测试只在IE8-中出现。
问题复现:
$("body").mousedown(function(e){ console.log(e.button);//各浏览器不一致 })
影响浏览器:
e.button值测试 | IE5 | IE7 | IE8 | IE9 | IE10 | IE11 | 火狐 | 谷歌 |
---|---|---|---|---|---|---|---|---|
鼠标左键 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 |
鼠标中键 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 |
鼠标右键 | 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
解决方案:
使用jquery的e.which属性(1:左键,2:中键,3:右键)可以实现夸浏览器的一致性
同时在jquery1.9.1的源码中可以找到对此问题的兼容解决方案
// Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); }
IE8下超过31个link style标签后失效
在IE8下最多仅允许31个link style标签,按照在HTML页面中出现先后顺序,从第32个style标签起,及以后的都无效。
解决方案只能发布前做标签合并,再发布。