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