瀏覽器兼容性小整理和一些js小問題(後面會繼續更新)

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

相關文章
相關標籤/搜索