child

image.png

  1. <div>
  2. 我是文本节点
  3. <!-- 我是一个注释 -->
  4. <h1>我是标题标签</h1>
  5. <a href="">我是超级链接</a>
  6. <p>我是段落标签</p>
  7. </div>
  8. <script>
  9. //元素节点->1
  10. //属性节点->2
  11. //文本节点->3
  12. //注释节点->8
  13. //document->9
  14. //DocumentFragment->11
  15. //
  16. //nodeName->元素节点的nodeName 大写
  17. var div=document.getElementsByTagName('div')[0];
  18. </script>

image.png
image.png
nodeName节点的名字
nodeValue节点的值
image.png
属性节点
image.png
我是假注释君
image.png
不能改,系统内置的

1.封装获取元素节点(DOM节点)方法

image.png
children ie8以下不支持,childNodes都支持
所以用childNodes实现children方法

写法一 数组写法

  1. <body>
  2. <div class="box" id="box" style="background-color: green;"
  3. >
  4. 我是文本节点
  5. <!-- 我是注释君 -->
  6. <h1>我是标题标签</h1>
  7. <a href="">我是超链接</a>
  8. <p>我是段落标签</p>
  9. </div>
  10. </body>
  11. <script src="./index.js"></script>
  12. <script>
  13. var div = document.getElementsByTagName('div')[0]; //
  14. // 1.元素节点 = 1
  15. // 2.属性节点 = 2
  16. // 3.文本节点 text = 3
  17. // 4.注释节点 comment = 8
  18. // 5.document = 9
  19. // 6.DocumentFragement = 11
  20. // nodeName -> 元素节点的nodeName 大写 只读
  21. // nodeValue 可写 属性、注释、文本可用
  22. // nodeType 只读
  23. function elemChildren(node){
  24. var arr = [],
  25. children = node.childNodes;
  26. for(var i = 0;i<children.length;i++){
  27. var childItem = children[i];
  28. if(childItem.nodeType===1){
  29. arr.push(childItem);
  30. }
  31. }
  32. return arr;
  33. }
  34. console.log(elemChildren(div));
  35. </script>
  1. function elemChildren(node){
  2. var arr = [],
  3. children = node.childNodes;//得到node元素下的所有元素
  4. for(var i = 0;i<children.length;i++){
  5. var childItem = children[i];
  6. if(childItem.nodeType===1){
  7. //把经过筛选的元素的集合返回 1先筛选 2放入集合 3返回集合
  8. arr.push(childItem);
  9. }
  10. }
  11. return arr;
  12. }
  13. console.log(elemChildren(div));

写法二 类数组

js中有自己属性的都是对象

  1. var div = document.getElementsByTagName('div')[0];
  2. function elemChildren(node){
  3. var temp = {
  4. 'length': 0,
  5. 'push': Array.prototype.push,
  6. 'splice': Array.prototype.splice
  7. },
  8. len = node.childNodes.length;
  9. for(var i = 0;i<len;i++){
  10. var childItem = node.childNodes[i];
  11. if(childItem.nodeType === 1){
  12. temp[temp['length']] = childItem;
  13. temp['length']++;
  14. // temp.push(childItem); push方法
  15. }
  16. }
  17. return temp;
  18. }
  19. console.log(elemChildren(div));
  1. var div = document.getElementsByTagName('div')[0];
  2. function elemChildren(node){
  3. var temp = {
  4. 'length': 0,
  5. 'push': Array.prototype.push,
  6. 'splice': Array.prototype.splice
  7. },
  8. len = node.childNodes.length;
  9. for(var i = 0;i<len;i++){
  10. var childItem = node.childNodes[i];
  11. if(childItem.nodeType === 1){
  12. temp[temp['length']] = childItem;
  13. temp['length']++;
  14. // temp.push(childItem); push方法
  15. }
  16. }
  17. return temp;
  18. }
  19. console.log(elemChildren(div));

问题

为什么是’length’

image.png

image.png
box2
可写
image.png
image.png

2.document的继承出处

document 构造函数 -> HTMLDocument 构造函数 -> Document

HTMLDocument 构造出来的对象里面有proto::Document.prototype

document.proto= HTMLDocument.prototype
HTMLDocument.prototype = Document.prototype

document.proto->HTMLDocument.prototype->Document

  1. console.log(document.__proto__===HTMLDocument.prototype)//true
  2. console.log(HTMLDocument.prototype.__proto__===Document.prototype)//true
  3. console.log(document.__proto__===Document.prototype)//false
  4. console.log(HTMLDocument.__proto__===Document.prototype)//false

HTMLDocument是document对象的构造函数,Document不是HTMLDocument的构造函数,因为document.proto===Document.prototype结果是false,但根据HTMLDocument.prototype.proto===Document.prototype,Document的原型在HTMLDocument的原型中
如下图类似
image.png
document的构造函数是HTMLDocument,而不是Document
image.png

image.png

  1. HTMLDocument.prototype.say=function() {
  2. console.log('我刚刚说我睡觉了');
  3. }
  4. Document.prototype.eat=function() {
  5. console.log('我刚刚吃了面');
  6. }
  7. document.say();
  8. document.eat();

为什么不是构造函数关系可以继承,因为其在原型链上
image.png
image.png

image.png
image.png

  1. <div>123</div>
  2. <script>
  3. Text.prototype.aaa='aaa';
  4. CharacterData.prototype.bbb='bbb';
  5. var div=document.getElementsByTagName('div')[0];
  6. var text=div.childNodes[0];
  7. console.log(text.bbb)
  8. </script>

bbb
证明是继承关系,document访问html

image.png

  1. <div>123</div>
  2. <p>234</p>
  3. <script>
  4. Element.prototype.aaa='aaa';
  5. HTMLElement.prototype.bbb='bbb';
  6. HTMLDivElement.prototype.ccc='ccc';
  7. var div=document.getElementsByTagName('div')[0];
  8. var p=document.getElementsByTagName('p')[0];
  9. console.log(div.ccc);
  10. console.log(div.bbb);
  11. console.log(div.aaa);
  12. </script>

div->HTMLDivElement->HTMLElement->Element 原型链
image.png
image.png
image.png
image.png
最后document原型链的终点Object的原型
任何对象都需要实例化,只不过有些对象是系统帮着已经实例化出来的
image.png

  1. <div>123</div>
  2. <p>234</p>
  3. <script>
  4. Element.prototype.aaa='aaa';
  5. HTMLElement.prototype.bbb='bbb';
  6. HTMLDivElement.prototype.ccc='ccc';
  7. var div=document.getElementsByTagName('div')[0];
  8. var p=document.getElementsByTagName('p')[0];
  9. console.log(div.ccc);
  10. console.log(div.bbb);
  11. console.log(div.aaa);
  12. console.log(p.aaa);
  13. console.log(p.bbb);
  14. console.log(p.ccc);
  15. console.log(Object.prototype.toString.call(div))//[object HTMLDivElement]
  16. </script>

HtmlParagraphElement->HTMLElement->Element 原型链
image.png

image.png
得到的div就是HTMLDivElement对象

image.png

  1. <div>123</div>
  2. <p>234</p>
  3. <script>
  4. var div=document.getElementsByTagName('div')[0];
  5. div.getElementById('')
  6. </script>

div没有get方法,证明div元素的原型链上没有get方法,elememt上没有get方法,只有document上有
image.png

image.png
document.getElementsByTagName(‘div’)[0]; div的构建过程,先拿到选择的元素,再以元素构建对象
如同数组、对象一样
image.png

image.png

  1. <div>
  2. <p>123</p>
  3. <input type="text" name="username">
  4. </div>
  5. <script>
  6. var div=document.getElementsByTagName('div')[0];
  7. div.getElementsByName('')
  8. </script>

image.png
image.png
image.png

  1. var div=document.getElementsByTagName('div')[0];
  2. var p= div.getElementsByTagName('p');
  3. console.log(p)

找div元素的p元素,有些get方法有,有些没有

3.DOM结构树

image.png
Document能解析html、xml,document既能解析html,又能解析xml,所以Document有方法构建document 。所以应该有HTMLDocument、XMLDocument方法,分开构建
有XMLElement

getElementById()

  1. <body>
  2. <div>
  3. <p>123</p>
  4. </div>
  5. </body>
  6. <script src="./index.js"></script>
  7. <script>
  8. // DOM操作深入
  9. //1 getElementById()
  10. //来自于Document.prototype
  11. //2. Element.prototype HTMLElement.prototype 没有
  12. var div = document.getElementById('div')[0];
  13. var p = div.getElementById('p')[0];
  14. console.log(p);
  15. </script>

image.png
image.png
大意可以通过document获取元素a 但是无法通过元素a再获取子元素

dom div形成原理

  1. //div形成原理
  2. var div = document.getElementsByTagName('div')[0];
  3. <div>
  4. <p>123</p>
  5. </div> -> function HTMLDivElement() {
  6. div = new HTMLDivElement
  7. }

HTMLDivElement 继承于 HTMLElement
image.png

getElementByName()

  1. Document.prototype 有<br />Element.prototype 没有

道理同getElementById

getElementsByTagName getElementsByClassName querySelector querySelectorAll

Document.prototype 有
Element.prototype 有
这些都有,可以在找出div里面继续寻找

  1. var div = document.getElementsByTagName('div')[0];
  2. var p = div.getElementsByTagName('p')[0];
  3. console.log(p);

image.png
原型链顶层 object.prototype

获取HTML head body 的原型方法

body:document.body
head:document.head
html:document.documentElment
image.png

image.png
image.png
系统内置方法,只能使用不能访问,访问会报错

作业
image.png
image.png
image.png
image.png