天天看點

浏覽器相容性小整理和一些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

繼續閱讀