W3C针对XHTML以及HTML开发一种DOM,这个DOM是基于HTMLElement和HTMLDocument实现的。除了少数元素只包含HTMLElement属性和方法外,每个HTML元素都通过特定的HTMLElement类型表示。然而并不是所以浏览器对DOM都支持的,下面列出了一些经常会遇到的不兼容的DOM使用问题。
1.childNodes
不同浏览器使用childNodes在处理Text节点存在一些差异。Mozilla认为元素之间的空白是Text节点;而IE,会忽略这些空白。可以通过判断childNodes[x].nodeValue == "#text",childNodes[x].nodeType == 1解决这个问题;或者使用children属性,children属性是一个数组,可以通过索引获取子节点;
2.document
IE使用document.all,而使用dom标准的浏览可以通过document.getElementsByTagName("*") ;
3.Id&getElementById
在IE中可以把Id当作元素使用,但在其他浏览器不支持。因此建议使用getElementById,getElementById在IE6中使用,如果元素Name等于Id,也会一同返回;
4.集合数组
IE中在使用集合类对象时候,访问可以通过()与[]。建议同一使用[]dom标准访问;
5.body对象
在IE中body对象要在<body>标签完全读入才会存在,而在FireFox中一开始就存在;
6.Type属性
在IE中input标签的type属性是只读的,但在FireFox中是可读写的;
7.removeNodes/removeChild
在FireFox节点中没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node);
8.ParentNode
IE与FireFox的访问父元素有区别,IE为Obj.ParentElement属性;FireFox为Obj.ParentNode属性解决办法:因为FireFox与IE都支持DOM,因此统一用ParentNode属性;
9.set/getAttribute
IE的setAttribute不能设置对象属性、事件属性和style相关的属性,对于自定义的可以设置;要注意在FF中,通过自定义设置的属性和通过.方法设置的属性不是同一个属性;
10.自定义属性
在FF中不支持像IE那样直接获取,建议统一用getAttribute方法;
11.class/className
IE中用”classname”做为属性名来设置或取得css class,FF和其它浏览器用”class”做为属性名来设置或取得,Dom标准的node object具有className属性
12.Range
在IE中有document.selection.createRange(),document.body[button|input].createTextRange();而在FF中可以通过document.getSelection()[.getRangeAt(0)];而对Range的操作中,除了IE和DOM标准的各种move外,FF中的node element还有selectionStart,selectionEnd只读属性