JavaScript 操作 DOM 的那些坑

515 查看

js在操作DOM中存在着许多跨浏览器方面的坑,本文花了我将近一周的时间整理,我将根据实例整理那些大大小小的“坑”。

DOM的工作模式是:先加载文档的静态内容、再以动态方式对它们进行刷新,动态刷新不影响文档的静态内容。

PS:IE 中的所有 DOM 对象都是以 COM 对象的形式实现的,这意味着 IE 中的 DOM可能会和其他浏览器有一定的差异。

Node 接口

特性/方法 类型/返回类型 说 明
nodeName String 节点的名字;根据节点的类型而定义
nodeValue String 节点的值;根据节点的类型而定义
nodeType Number 节点的类型常量值之一
ownerDocument Document 返回某元素的根元素
firstChild Node 指向在childNodes列表中的第一个节点
lastChild Node 指向在childNodes列表中的最后一个节点
childNodes NodeList 所有子节点的列表
previousSibling Node 返回选定节点的上一个同级节点,若不存在,则返回null
nextSibling Node 返回被选节点的下一个同级节点,若不存在,则返回null
hasChildNodes() Boolean 如果当前元素节点拥有子节点,返回true,否则返回false
attributes NamedNodeMap 返回包含被选节点属性的 NamedNodeMap
appendChild(node) node 将node添加到childNodes的末尾
removeChild(node) node 从childNodes中删除node
replaceChild(newnode, oldnode) Node 将childNodes中的oldnode替换成newnode
insertBefore Node 在已有子节点之前插入新的子节点

firstChild 相当于 childNodes[0]lastChild 相当于childNodes[box.childNodes.length - 1]

nodeType返回结点的类型

innerHTML 和 nodeValue

两者区别

nodeName属性获得结点名称

tagName

getElementsByTagName()方法将返回一个对象数组 HTMLCollection(NodeList),这个数组保存着所有相同元素名的节点列表。

PS:IE 浏览器在使用通配符的时候,会把文档最开始的 html 的规范声明当作第一个元素节点。

节点的绝对引用:

节点的相对引用:(设当前对节点为node)

节点信息

创建新节点

获取鼠标点击事件的位置

以下所描述的属性在chromeSafari 都很给力的支持了。

问题一:FirefoxChromeSafariIE9都是通过非标准事件的pageXpageY属性来获取web页面的鼠标位置的。pageX/Y获取到的是触发点相对文档区域左上角距离,以页面为参考点,不随滑动条移动而变化

问题二:在IE 中,event 对象有 x, y 属性(事件发生的位置的 x 坐标和 y 坐标)火狐中没有。在火狐中,与event.x 等效的是event.pageXevent.clientXevent.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。

offsetX:IE特有,chrome也支持。鼠标相比较于触发事件的元素的位置,以元素盒子模型的内容区域的左上角为参考点,如果有boder,可能出现负值

问题三:
scrollTop为滚动条向下移动的距离,所有浏览器都支持document.documentElement

其余参照:http://segmentfault.com/a/1190000002559158#articleHeader11

参照表

+为支持,-为不支持):

查看下方DEMO
你会发现offsetXFirefox下是undefined,在chromeIE则会正常显示。

https://jsfiddle.net/f4am208m/embedded/result/

2232231280-553f23779b846_articlex

offsetLeft和style.left区别