最近在啃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