最近在啃jQuery的源码,估计会啃到不少浏览器兼容性的问题,因此整理一下javascript
1,IE下的内存泄露.java
在IE中不在DOM树中的独立节点有javascript变量引用它的时候不会被回收。web
解决:手动将该js变量置为nullchrome
2,IE<9,Nodelist没法调用slice和push浏览器
解决:手动模拟app
3,IE,直接使用elem.attrName的形式得到属性值会自动串改DOM元素的某些属性,好比a的href函数
解决:使用elem.getAttribute(attrName)或elem.getAttributeNode(attrName).value
4,IE<9,使用getAttribute获取input元素的value时返回null对象
解决:经过elem.defaultValue来获取事件
5,IE<9,不能直接使用getAttribute('className')来获取classip
解决:使用getAttribute('class')
6,Opera < 10,当一个元素有多个class的时候,用getElementsByClassName来获取第二个类会出错。
解决:不要使用这个API
7,黑莓4.6的浏览器会返回那些不在DOM树中的节点。
解决:用elem.parentNode来判断是否在DOM树中
8,IE8中的QSA没法使用[selected]之类的属性选择符,没法使用:checked之类的伪元素,对name的大小写不敏感
9,contains不该该包含自身
10,检测字符串能够转换为数字,使用这个方法obj - parseFloat( obj ) >= 0
11,delete DOM元素上的自定义属性时,IE<9会报错,具体规则以下
var div = document.createElement( "div" ); try { //IE7不管div是否有test都会抛出异常。 //IE8在没test的状况下会抛出异常,有test的状况下不会。 //IE9都不会。 delete div.test; } catch( e ) { alert(1); }
因此这里要作判断,IE下使用removeAttribute来删除
12,JSON.stringify的tips
//var see = {name:'see',id:{toJSON:function () {}}};JSON.stringify(see)
//var see = {my:function () {}};JSON.stringify(see);
//JSON.stringify(window);
//stringify是没法转换带函数、带循环引用的对象的
13,IE6-7用InnerHTML生成table会自动插入tbody
14,IE678不能直接用InnerHTML生成link元素
15,checkbox进行append后,它的checked状态不会保留。IE67
16,radio在进行append后,它的checked状态若是出如今name属性以前则不会保留。webkit(实测只有safari会出现这样的情况)
17,IE下textarea的defaultValue不必定被正确地克隆
18,Webkit下fragment元素里的input元素的checked状态不会被正确克隆
19,有的事件没有target,好比load ,IE67
20,event.target不能为TEXT_NODE,chrome23+,safari老版本
21,老版本的FF不会触发非左键click的冒泡
22,IE678在detach事件时,还须要手动将onEventType如onclick置为null