W3C針對(duì)XHTML以及HTML開發(fā)一種DOM,這個(gè)DOM是基于HTMLElement和HTMLDocument實(shí)現(xiàn)的。除了少數(shù)元素只包含HTMLElement屬性和方法外,每個(gè)HTML元素都通過特定的HTMLElement類型表示。然而并不是所以瀏覽器對(duì)DOM都支持的,下面列出了一些經(jīng)常會(huì)遇到的不兼容的DOM使用問題。
1.childNodes
不同瀏覽器使用childNodes在處理Text節(jié)點(diǎn)存在一些差異。Mozilla認(rèn)為元素之間的空白是Text節(jié)點(diǎn);而IE,會(huì)忽略這些空白。可以通過判斷childNodes[x].nodeValue == "#text",childNodes[x].nodeType == 1解決這個(gè)問題;或者使用children屬性,children屬性是一個(gè)數(shù)組,可以通過索引獲取子節(jié)點(diǎn);
2.document
IE使用document.all,而使用dom標(biāo)準(zhǔn)的瀏覽可以通過document.getElementsByTagName("*") ;
3.Id&getElementById
在IE中可以把Id當(dāng)作元素使用,但在其他瀏覽器不支持。因此建議使用getElementById,getElementById在IE6中使用,如果元素Name等于Id,也會(huì)一同返回;
4.集合數(shù)組
IE中在使用集合類對(duì)象時(shí)候,訪問可以通過()與[]。建議同一使用[]dom標(biāo)準(zhǔn)訪問;
5.body對(duì)象
在IE中body對(duì)象要在<body>標(biāo)簽完全讀入才會(huì)存在,而在FireFox中一開始就存在;
6.Type屬性
在IE中input標(biāo)簽的type屬性是只讀的,但在FireFox中是可讀寫的;
7.removeNodes/removeChild
在FireFox節(jié)點(diǎn)中沒有removeNode方法,必須使用如下方法 node.parentNode.removeChild(node);
8.ParentNode
IE與FireFox的訪問父元素有區(qū)別,IE為Obj.ParentElement屬性;FireFox為Obj.ParentNode屬性解決辦法:因?yàn)镕ireFox與IE都支持DOM,因此統(tǒng)一用ParentNode屬性;
9.set/getAttribute
IE的setAttribute不能設(shè)置對(duì)象屬性、事件屬性和style相關(guān)的屬性,對(duì)于自定義的可以設(shè)置;要注意在FF中,通過自定義設(shè)置的屬性和通過.方法設(shè)置的屬性不是同一個(gè)屬性;
10.自定義屬性
在FF中不支持像IE那樣直接獲取,建議統(tǒng)一用getAttribute方法;
11.class/className
IE中用”classname”做為屬性名來設(shè)置或取得css class,F(xiàn)F和其它瀏覽器用”class”做為屬性名來設(shè)置或取得,Dom標(biāo)準(zhǔn)的node object具有className屬性
12.Range
在IE中有document.selection.createRange(),document.body[button|input].createTextRange();而在FF中可以通過document.getSelection()[.getRangeAt(0)];而對(duì)Range的操作中,除了IE和DOM標(biāo)準(zhǔn)的各種move外,F(xiàn)F中的node element還有selectionStart,selectionEnd只讀屬性
1.childNodes
不同瀏覽器使用childNodes在處理Text節(jié)點(diǎn)存在一些差異。Mozilla認(rèn)為元素之間的空白是Text節(jié)點(diǎn);而IE,會(huì)忽略這些空白。可以通過判斷childNodes[x].nodeValue == "#text",childNodes[x].nodeType == 1解決這個(gè)問題;或者使用children屬性,children屬性是一個(gè)數(shù)組,可以通過索引獲取子節(jié)點(diǎn);
2.document
IE使用document.all,而使用dom標(biāo)準(zhǔn)的瀏覽可以通過document.getElementsByTagName("*") ;
3.Id&getElementById
在IE中可以把Id當(dāng)作元素使用,但在其他瀏覽器不支持。因此建議使用getElementById,getElementById在IE6中使用,如果元素Name等于Id,也會(huì)一同返回;
4.集合數(shù)組
IE中在使用集合類對(duì)象時(shí)候,訪問可以通過()與[]。建議同一使用[]dom標(biāo)準(zhǔn)訪問;
5.body對(duì)象
在IE中body對(duì)象要在<body>標(biāo)簽完全讀入才會(huì)存在,而在FireFox中一開始就存在;
6.Type屬性
在IE中input標(biāo)簽的type屬性是只讀的,但在FireFox中是可讀寫的;
7.removeNodes/removeChild
在FireFox節(jié)點(diǎn)中沒有removeNode方法,必須使用如下方法 node.parentNode.removeChild(node);
8.ParentNode
IE與FireFox的訪問父元素有區(qū)別,IE為Obj.ParentElement屬性;FireFox為Obj.ParentNode屬性解決辦法:因?yàn)镕ireFox與IE都支持DOM,因此統(tǒng)一用ParentNode屬性;
9.set/getAttribute
IE的setAttribute不能設(shè)置對(duì)象屬性、事件屬性和style相關(guān)的屬性,對(duì)于自定義的可以設(shè)置;要注意在FF中,通過自定義設(shè)置的屬性和通過.方法設(shè)置的屬性不是同一個(gè)屬性;
10.自定義屬性
在FF中不支持像IE那樣直接獲取,建議統(tǒng)一用getAttribute方法;
11.class/className
IE中用”classname”做為屬性名來設(shè)置或取得css class,F(xiàn)F和其它瀏覽器用”class”做為屬性名來設(shè)置或取得,Dom標(biāo)準(zhǔn)的node object具有className屬性
12.Range
在IE中有document.selection.createRange(),document.body[button|input].createTextRange();而在FF中可以通過document.getSelection()[.getRangeAt(0)];而對(duì)Range的操作中,除了IE和DOM標(biāo)準(zhǔn)的各種move外,F(xiàn)F中的node element還有selectionStart,selectionEnd只讀屬性