浏览器兼容性小整理和一些js小问题(后面会继续更新)
最近在啃jQuery的源码,估计会啃到很多浏览器兼容性的问题,所以整理一下
1,IE下的内存泄露.
在IE中不在DOM树中的独立节点有javascript变量引用它的时候不会被回收。
解决:手动将该js变量置为null
2,IE<9,Nodelist无法调用slice和push
解决:手动模拟
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')来获取class
解决:使用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