饥人谷技术博客

DOM API

2019-03-04  本文已影响4人  吴一晏

DOM

全名 Document Object Model
DOM可以想象成一棵树。

DOM树.jpg
每一个分支就叫节点NodeNode分为Docementhtml),Element(元素)和Text(文本)以及其他不重要的。
节点内容储存在内存里,每种节点存哪些属性是由DOM标准规定的。
DOM的功能就是将 页面中的节点通过构造函数构造成对象。
构造函数关系.jpg

Q:DOM API需要背嘛?
A:不需要背,需要掌握它的增删改查作用!

Node接口

需要注意的几个点:

  1. 属性
  1. 方法(如果一个属性是函数,那么这个属性就也叫做方法;换言之,方法是函数属性)
  1. 通过脚本调用有关的DOM接口进行了文本节点的插入和分割等。
  2. HTML中超长的文本节点会被浏览器自动分割为多个相邻文本节点。
    举例
var wrapper = document.createElement("div");

wrapper.appendChild(document.createTextNode("Part 1 "));
wrapper.appendChild(document.createTextNode("Part 2 "));

// 这时(规范化之前),wrapper.childNodes.length === 2
// wrapper.childNodes[0].textContent === "Part 1 "
// wrapper.childNodes[1].textContent === "Part 2 "

wrapper.normalize();
// 现在(规范化之后), wrapper.childNodes.length === 1
// wrapper.childNodes[0].textContent === "Part 1 Part 2"

Document接口

注意的点

  1. document.write() 每次写入分三步 open>write>close,重新写入需要重新open,因此会造成一个重新写入会覆盖之前内容的结果。所以write使用时不要出现延时或者异步。
  2. 关于createDocumentFragment()这是一个非常节省性能的操作,他和Document最大的区别在于他不是真实DOM树的一部分,它的变化不会引起DOM树的重新渲染的操作reflow ,且不会导致性能等问题。
    最常用的方法是使用文档片段(DocumentFragment)作为参数(例如,任何 Node接口类似 Node.appendChildNode.insertBefore,这种情况下被添加(append)或被插入(inserted)的是片段的所有子节点, 而非片段本身。因为所有的节点会被一次插入到文档中,而这个操作仅发生一个重渲染的操作,而不是每个节点分别被插入到文档中,因为后者会发生多次重渲染的操作。

面试题:请把<body><p>第1行</p><p>第2行</p>...</body>(body之间有100个p元素)插入body里面,注意:需要考虑到性能问题。

var oFrag=document.createDocumentFragment();
       for(var i=0;i<100;i++)
       {
              var op=document.createElement("P");
              var oText=document.createTextNode(i);
              op.appendChild(oText);
              oFrag.appendChild(op);
       }
       document.body.appendChild(oFrag);
  1. 属性
  1. 方法

作业题难点

  1. 元素 Element 的 NodeType 值为AC
    A :1
    B: '1'
    C:Node. ELEMENT_NODE

  2. <div id=parent></div>
    parent 的值为 C
    A:就是这个 id 为 parent 的 div 对应的 Element 对象
    B:父窗口
    C:如果有父窗口,就是父窗口。如果没有,就是当前窗口

  3. HTMLCollection与NodeList的区别有A C
    A:HTMLCollection实例对象的成员只能是Element节点,NodeList实例对象的成员可以包含其他节点。
    B: HTMLCollection实例对象都是动态集合,节点的变化会实时反映在集合中。NodeList实例对象都是静态集合。
    C:HTMLCollection实例对象可以用id属性或name属性引用节点元素,NodeList只能使用数字索引引用。

  4. var parent = document.getElementById('parent');
    parent.childNodes.length // 2
    parent.appendChild(document.createElement('div'));
    parent.childNodes.length // 请问现在 length 是多少 3

  5. var allDiv = document.querySelectorAll('div')
    allDiv.length // 假设是 2
    document.body.appendChild( document.createElement('div') )
    allDiv.length // 请问现在 length 的值是多少???2
    6.上面两题,为什么一个 length 会动态变化,另一个 length 却不会动态变化?A B
    A:parent.childNodes 是动态集合。所谓动态集合就是一个活的集合,DOM树删除或新增一个相关节点,都会立刻反映在NodeList接口之中。
    B:document.querySelectorAll方法返回的是一个静态集合。DOM内部的变化,并不会实时反映在该方法的返回结果之中。

上一篇 下一篇

猜你喜欢

热点阅读