Table of Contents generated with DocToc

文档树

Document Object Model (DOM) 为文档对象模型,
它使用对象的表示方式来表示对应的文档结构及其中的内容。

下面为一个样例 p 元素在文档中的对象所包含的所有属性。

  1. <p id="target">Hello, World!</p>
  1. p#targetaccessKey: ""
  2. align: ""
  3. attributes: Named
  4. NodeMapbaseURI: ""
  5. childElementCount: 0
  6. childNodes: NodeList[1]
  7. children: HTMLCollection[0]
  8. classList: DOMTokenList[0]
  9. className: ""
  10. clientHeight: 0
  11. clientLeft: 0
  12. clientTop: 0
  13. clientWidth: 0
  14. contentEditable: "inherit"
  15. dataset: DOM
  16. StringMapdir: ""
  17. draggable: false
  18. firstChild: text
  19. firstElementChild: null
  20. hidden: false
  21. id: "target"
  22. innerHTML: "Hello, World!"
  23. innerText: "Hello, World!"
  24. isContentEditable: false
  25. lang: ""
  26. lastChild: text
  27. lastElementChild: null
  28. localName: "p"
  29. namespaceURI: "http://www.w3.org/1999/xhtml"
  30. nextElementSibling: null
  31. nextSibling: null
  32. nodeName: "P"
  33. nodeType: 1
  34. nodeValue: null
  35. offsetHeight: 0
  36. offsetLeft: 0
  37. offsetParent: null
  38. offsetTop: 0
  39. offsetWidth: 0
  40. onabort: null
  41. onautocomplete: null
  42. onautocompleteerror: null
  43. onbeforecopy: null
  44. onbeforecut: null
  45. onbeforepaste: null
  46. onblur: null
  47. oncancel: null
  48. oncanplay: null
  49. oncanplaythrough: null
  50. onchange: null
  51. onclick: null
  52. onclose: null
  53. oncontextmenu: null
  54. oncopy: null
  55. oncuechange: null
  56. oncut: null
  57. ondblclick: null
  58. ondrag: null
  59. ondragend: null
  60. ondragenter: null
  61. ondragleave: null
  62. ondragover: null
  63. ondragstart: null
  64. ondrop: null
  65. ondurationchange: null
  66. onemptied: null
  67. onended: null
  68. onerror: null
  69. onfocus: null
  70. oninput: null
  71. oninvalid: null
  72. onkeydown: null
  73. onkeypress: null
  74. onkeyup: null
  75. onload: null
  76. onloadeddata: null
  77. onloadedmetadata: null
  78. onloadstart: null
  79. onmousedown: null
  80. onmouseenter: null
  81. onmouseleave: null
  82. onmousemove: null
  83. onmouseout: null
  84. onmouseover: null
  85. onmouseup: null
  86. onmousewheel: null
  87. onpaste: null
  88. onpause: null
  89. onplay: null
  90. onplaying: null
  91. onprogress: null
  92. onratechange: null
  93. onreset: null
  94. onresize: null
  95. onscroll: null
  96. onsearch: null
  97. onseeked: null
  98. onseeking: null
  99. onselect: null
  100. onselectstart: null
  101. onshow: null
  102. onstalled: null
  103. onsubmit: null
  104. onsuspend: null
  105. ontimeupdate: null
  106. ontoggle: null
  107. onvolumechange: null
  108. onwaiting: null
  109. onwebkitfullscreenchange: null
  110. onwebkitfullscreenerror: null
  111. onwheel: null
  112. outerHTML: "<p id="target">Hello, World!</p>"
  113. outerText: "Hello, World!"
  114. ownerDocument: document
  115. parentElement: null
  116. parentNode: null
  117. prefix: null
  118. previousElementSibling: null
  119. previousSibling: null
  120. scrollHeight: 0
  121. scrollLeft: 0
  122. scrollTop: 0
  123. scrollWidth: 0
  124. shadowRoot: null
  125. spellcheck: true
  126. style: CSSStyle
  127. DeclarationtabIndex: -1
  128. tagName: "P"
  129. textContent: "Hello, World!"
  130. title: ""
  131. translate: true
  132. webkitdropzone: ""
  133. __proto__: HTMLParagraphElement

通过使用 DOM 提供的 API (Application Program Interface)
可以动态的修改节点(node),也就是对 DOM 树的直接操作。
浏览器中通过使用 JavaScript 来实现对于 DOM 树的改动。

DOM 包含

  • DOM Core
  • DOM HTML
  • DOM Style
  • DOM Event

HTML 转换 DOM 树

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>My title</title>
  5. </head>
  6. <body>
  7. <a href="">My Link</a>
  8. <h1>My header</h1>
  9. </body>
  10. </html>

文档树(DOM Tree) - 图1

节点遍历

在元素节点中提取自己所需的节点,并予以操作。

  1. // Document.getElementsByTagName()
  2. // 更具标签名找到目标节点的集合,此例中为 <h1>My header</h1>
  3. var node = document.getElementsByTagName('h1')[0];
  4. // Node.parentNode;
  5. // 获得目标节点的父节点,此例中为 body 元素
  6. node.parentNode;
  7. // Node.firstChild
  8. // 获得目标节点的第一个子节点,此例中为 "My header"
  9. node.firstChild;
  10. // Node.lastChild
  11. // 获得目标节点的最后一个子节点,此例中为 "My header"
  12. node.lastChild;
  13. // Node.previousSibling;
  14. // 获得目标节点的前一个相邻节点
  15. node.previousSibling;
  16. // Node.nextSibling;
  17. // 获得目标节点的下一个相邻节点
  18. node.nextSibling;

节点类型

常用节点类型

  • ELEMENT_NODE 可使用 Document.createElement('elementName'); 创建
  • TEXT_NODE 可使用 Document.createTextNode('Text Value'); 创建

不常用节点类型

  • COMMENT_NODE
  • DOCUMENT_TYPE_NODE

不同节点对应的NodeType类型

此值可以通过 Node.nodeType 来获取。

节点编号 节点名称
1 Element
2 Attribute
3 Text
4 CDATA Section
5 Entity Reference
6 Entity
7 Processing Instrucion
8 Comment
9 Document
10 Document Type
11 Document Fragment
12 Notation

NOTE:此处需要清楚节点元素的区别。我们平常说的元素
其实指的是节点中得元素节点,所以说节点包含元素,节点还包括文本节点、实体节点等。

元素遍历

元素节点符合 HTML DOM 树规则,所以它与 DOM 中存在的节点相似。

  1. <p>
  2. Hello,
  3. <em>Xinyang</em>!
  4. 回到
  5. <a href="http://li-xinyang.com">
  6. 主页
  7. </a>
  8. </p>
  1. // 在选取元素节点后
  2. p.firstElementChild; // <em>Xinyang</em>
  3. p.lastElementChild; // <a href="http://li-xinyang.com">主页</a>
  4. em.nextElementSibling; // <a href="http://li-xinyang.com">主页</a>
  5. em.previousElementSibling; // "Hello,"