DOM简述2

总结 + 我认为的重点

  1. 搜索归纳,以掌握 DOM 基本思想

  2. DOM 的作用 === 表示 HTML 文档

  3. DOM提供的 API === 查询,修改 HTML 文档内容

  4. 输入document.documentElement来获得 html 节点

  5. 只有Node.querySelectorAll()返回的数组不是动态的

  6. scrollHeight返回的是高度

  7. scrollTop返回的是滚动高度

对 DOM 的一些理解

  1. DOM === 想象的树型结构模型.

  2. DOM提供的API的作用就是修改或者查看 HTML 代码

  3. DOM中的O指的是Object,他是在内存中,按照树型结构,通过构造函数(如Node,Element(翻译为标签比较好),Document三个构造函数),构造出对象,将 DOM 展现到内存中

  4. DOM的D指的是Document,可以认为是 HTML 文档

  5. DOM的M指的是Model,因为在 HTML结构 在内存中不好用笔表示,所以用一个模型来表示,这个模型就是树型结构

  6. DOM 树型结构

    1. 上图就是DOM,其中的每个节点(包括矩形节点和椭圆形节点)都是Node类型

    2. document节点是Document构造函数的一个实例对象,document节点代表了整个文档(整个树型结构

      ,我们可以通过直接输入document来获取document节点

    3. html节点是Element构造函数的一个实例对象,html节点又叫根节点

      我们可以通过输入document.documentElement来获得html节点

    4. 椭圆形的文本节点:"你好" 是Text构造函数的一个实例对象(文本节点是Text构造函数的一个实例对象)

    5. Node,Element,Text的关系

DOM的归纳和总结

  1. JavaScript将 HTML 文档渲染成 DOM 的树型结构.

  2. 有了树形结构, 第一件事情是什么?当然是获取DOM的节点啦!

  3. 获得节点的方法:

    1. 直接在DOM寻找: document.querySelector(AAAA)document.querySelectorAll(AAAA)
    2. 通过节点关系获得节点
      1. 兄弟关系
      2. 儿子关系
      3. 父关系
  4. 获得节点后,首先你要了解获得的节点是什么吧(比如你要知道节点是什么类型)?

    了解节点:

    1. Node.nodeName
    2. Node.nodeType
    3. Node.textContent
  5. 既然节点可以对应 HTML 文档的标签,那么我可不可以通过 DOM 来处理标签的属性?搜索处理标签属性知道所有属性的处理方法.

  6. 我可以通过 DOM 的 API 修改 DOM 的结构吗?

    1. 创建节点

      document.createElement("div")生成Element节点

      document.createTextNode("你好")生成Text节点

    2. 通过Node方法将创建的节点拼接到 DOM 中,搜索Node方法

Node类型的一些属性和方法

Node属性

  1. 节点本身某些特征的属性:
    • Node.nodeName:
      • 看着DOM,如果你不确定某个Node节点是什么类型(不确定某个Node节点是矩形还是椭圆形)
        • 返回节点类型,重要的返回的值有大写的HTML元素名, #text ,#document
    • Node.nodeType:
      • 根据Node类型返回某些数字
      • Element类型,返回的数字是1
      • Text类型,返回的数字是3
      • Document类型,返回的数字的9
    • Node.textContent
      • 返回的当前节点及其所有后代的文本内容
      • 值得注意的是,因为Node.textContent是Node属性,所以文本节点也是有textContent的
      • innerHTMLinnerText是Element的属性,所以TextNode.innerHTML返回的是undefined,注意,并不是返回null
  2. 节点结构关系属性
    • 兄弟关系
      • Node.nextSibling
      • Node.previousSibling
    • 儿子关系
      • Node.childNodes
      • Node.firstChild
      • Node.lastChild
    • 父关系
      • Node.parentNode
    • 上面的所有关系属性都可以获取到Text节点(除了父关系)
    • Node.childNodes是最特殊的,它返回的是一个伪数组,里面是Node节点,并且伪数组内的值是动态变化的

Node方法

  • Node.appendChild()

  • Node.hasChildNodes()

  • Node.cloneNode()

  • Node.insertBefore()

  • Node.removeChild()

  • Node.replaceChild()

  • Node.contains()

  • Node.isEqualNode()

  • Node.isSameNode()

  • Node.normalize()

document节点的一些属性和方法

document属性

  1. 用于指向其他节点(快捷获取某些特殊节点)的属性

    • document.documentElement指向 DOM 的 html节点
    • document.activeElement指向获得焦点的那个节点
  2. 返回文档特定元素的伪数组集合的属性

    • document.links
    • document.forms
    • document.images
    • document.embeds
    • 等等
  3. 返回文档信息的属性

    • document.location
    • document.readyState返回的是当前文档的状态,
    • 等等

document获取节点方法

  1. 方法:document.querySelector(AAAA)document.querySelectorAll(AAAA)

  2. 注意点:

    • 如果获取标签,那么直接AAAA === "div" 即可
    • 第一个返回的是第一个符合CSS选择器AAAA条件的节点
    • 第二个返回的是伪数组,里面包含了所有符合选择器的节点
    • 第二个返回的结果不是动态的,不会实时反映元素节点的变化
    • 这两个方法除了是 document ,还可以是某个 Node 节点
    • 其他查找方法不学,没有必要

document生成节点的方法

  1. document.createElement("div")生成Element节点
  2. document.createTextNode("你好,我叫饶家俊")生成Text节点

document事件相关的方法

待续

document写入方法

待续

Element节点的一些属性和方法

属性

  1. Element节点的属性处理

    搜索处理标签属性

  2. 盒模型相关属性

    1. 获得整个页面高度:document.documentElement.scrollHeight

    2. 获得整个浏览器视口的高度document.documentElement.clientHeight // 不包括滚动条

    3. 某个Element距离浏览器视口左上角的坐标

      • Element.getBoundingClientRect().left
      • Element.getBoundingClientRect().top
    4. 某个Element距离整个网页左上角的坐标(,注意和上一个区别)

      • Element.getBoundingClientRect().left + document.documentElement.scrollLeft
      • Element.getBoundingClientRect().top + document.documentElement.scrollTop
    5. 下面的可以不看了,等到遇到问题的时候再看

    6. 容器 === 浏览器的可视区域

    7. Node.clientHeight,Node.clientWidth

      • 某个 Element节点: 经过浏览器视口变化,返回节点所占据整个页面的高度和宽度(只有padding,margin和border不是)
      • html节点: 返回浏览器视口宽度和高度
    8. Node.clientTop,Node.clientLeft

      • 返回节点的左边框(border)和上边框(border)的边框宽度
    9. Noe.scrollHeight, Node.scrollWidth

      • 某个Element节点: 经过浏览器视口变化,返回节点所占据整个页面的高度和宽度(只有padding,margin和border不是)
      • html节点: 经过浏览器视口变化,返回整个页面的高度和宽度
    10. Node.scrollLeft, Node.scrollTop

    • 返回向下的滚动条和向右的滚动条滚动的像素
    1. Node.offsetHeight, Node.offsetWidth
    • 某个 Element节点: 经过浏览器视口变化,返回节点所占据整个页面左上角距离右下角的宽度和高度,并且左上角是包括padding和border
    • html节点: 经过浏览器视口变化,返回整个页面的高度和宽度
    1. Node.offsetLeft,Node.offsetTop
    • 与父节点之间的宽度和高度???

处理标签属性

  1. 最正常,也最麻烦的写法

    1. 增:Node.setAttribute("属性名", "属性值")
    2. 删: Node.removeAttribute("属性名")
    3. 改: Node.setAttribute("已经存在属性名", "新属性值")
    4. 查:Node.getAttribute("属性名")
  2. 但是,对于标准属性来说,可以写的简单一点

    1. 增:Node.style = "border: 10xp solid black"
    2. 删: 无法简写
    3. 改: Node.style = "border: 10px solid red"
    4. 查:Node.style
  3. 对于标准属性的 class 属性来说,因为它实在是太重要了,所以对于class属性也有一套方法:

    1. 首先获得包含所有属性的伪数组Node.classList

    2. 伪数组有以下方法:

      add():追加一个class。
      remove():移除一个class。
      contains():检查当前元素是否包含某个class。
      toggle():将某个class移入或移出当前元素。
      item():返回指定索引位置的class。其实用divTag.classList[1]这样更好
      toString():将class的列表转为字符串。
      
      

题目

  1. HTML 代码
<div id=parent></div>

​ 问: parent的值是多少?

  1. HTMLCollection与NodeList的区别有 答案: AC

    A. HTMLCollection实例对象的成员只能是Element节点,NodeList实例对象的成员可以包含其他节点。

    B. HTMLCollection实例对象都是动态集合,节点的变化会实时反映在集合中。NodeList实例对象都是静态集合。

    C. HTMLCollection实例对象可以用id属性或name属性引用节点元素,NodeList只能使用数字索引引用。

  2. 代码

    var parent1 = document.getElementById('parent1');
    parent1.childNodes.length // 2
    parent1.appendChild(document.createElement('div'));
    parent1.childNodes.length // 请问现在 length 是多少  答案是3
    
    var allDiv = document.querySelectorAll('div')
    allDiv.length // 假设是 2
    document.body.appendChild(  document.createElement('div')  )
    allDiv.length // 请问现在 length 的值是多少???    答案是2
    
    

    答案的原因不是什么动态集合与静态集合,而是第一次的代码重新进行一次查询,而第二次的代码并没有重新进行查询,如果想让第二次的答案是3,那么把第二次的最后一句代码删去,并加上allDiv = document.querySelectorAll('div');allDiv.length就行了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342