notebooks
  • notebooks
  • _planning
    • 2022 OKR
    • basketball
    • swimming
  • communication
    • Dubbo
    • Kafka
    • Messaging
    • RPC
    • Thrift
  • computation
    • map-reduce
  • cs-basic-knowledge
    • computer-architecture
    • data-structure-and-algorithms
    • networks
    • os
  • devops
    • Docker
    • Linux
    • Prometheus
    • operations
    • security
    • trouble-shooting
  • distributed-knowledge
    • Zookeeper_CMD
    • distributed-system
  • game-engine
    • Unity
  • others
    • appium使用
  • protocols
    • http(s)协议
    • 官方链接
    • sip
  • storage
    • Elasticsearch
    • GuavaCache
    • MySQL
    • MySQL_CMD
    • NoSQL
    • Redis
    • Redis_CMD
  • system-design
    • system-design
  • tools
    • Git
    • IDEA
    • Mac
    • VScode
    • Vim
  • _working
    • doc-template
      • backend-design-review
      • correction-of-error
      • service-review
    • process
      • domain-backup
      • oncall
  • blogs
    • history
      • 8088/8086微处理器
      • 8088/8086指令系统
      • CSS-DOM
      • CSS定位
      • CSS工作原理
      • CSS控制背景
      • CSS浮动布局
      • CSS盒模型
      • Chrome开发者工具使用方法
      • DOM
      • Django Model模型层学习
      • Django-REST-framework Serializers学习
      • Django-REST-framework Views和ViewSets学习
      • Django View视图层学习
      • Gvim下Emmet安装及使用教程
      • HTTP协议简介
      • HashMap原理初探
      • JavaScript简史
      • JavaScript语法
      • Java内存模型和GC机制
      • Java基础——Lambda学习
      • Java基础——方法引用
      • Java基础——枚举类型
      • Java类加载机制
      • KMP算法
      • Kafka学习
      • Linux下用命令行编译Java程序
      • MathJax简介和基本用法
      • Python实现常见数据结构
      • Python装饰器总结
      • TCP协议的三次握手和四次挥手
      • Thrift学习
      • asyncio学习
      • markdown的常用语法
      • 修改hosts文件实现翻墙
      • 充实文档的内容
      • 关系数据库
      • 关系数据库标准语言SQL(一)
      • 关系数据库标准语言SQL(二)
      • 关系数据理论
      • 关系查询处理和查询优化
      • 内联元素和块级元素
      • 剑指offer算法题练习
      • 动态创建标记
      • 图形化用户界面
      • 在Eclipse中使用Maven构建Java Web项目
      • 增加微博秀遇到的一些问题
      • 处理机调度
      • 如何用github和hexo搭建个人博客
      • 存储管理
      • 存储系统的层次结构
      • 学习模仿lionhit网站首页的过程总结
      • 实用的GitHub小技巧
      • 并发控制
      • 循环与分支程序设计
      • 指令系统的设计
      • 指令级并行及其开发——硬件方法
      • 搭建自己的VPN服务器
      • 操作系统用户界面
      • 数据库安全性
      • 数据库完整性
      • 数据库恢复技术
      • 数据库绪论
      • 数据库编程
      • 数据库设计
      • 数据抽象
      • 文件系统
      • 文法和语言
      • 最佳实践
      • 案例研究:JavaScript图片库
      • 案例研究:图片库改进版
      • 汇编语言程序格式
      • 汇编语言程序设计基础知识
      • 流水线技术
      • 深度优先搜索和广度优先搜索
      • 牛客网——网易2017秋招编程题集合
      • 用JavaScript实现动画效果
      • 第一篇博客
      • 经典排序算法总结(Java实现)
      • 经典查找算法总结(Java实现)
      • 综合示例
      • 编译原理引论
      • 背包、队列和栈
      • 虚拟机安装Linux系统及常用软件
      • 计算机操作系统绪论
      • 计算机系统结构的基础知识
      • 设备管理
      • 设计模式之代理模式
      • 设计模式之单例模式
      • 设计模式之工厂模式
      • 设计模式之策略模式
      • 设计模式之观察者模式
      • 词法分析
      • 进程管理
      • 闭包
      • 阻止Google自动跳转到香港服务器的方法
      • 项目部署过程
  • programming-language
    • C#
      • C#
    • C&C++
      • C
    • C&C++
      • C++
    • Java
      • GoogleGuice
    • Java
      • JVM
    • Java
      • Java
    • Java
      • Maven
    • Java
      • Mybatis
    • Java
      • Spring知识
    • Java
      • SpringBoot
    • Java
      • Tomcat
    • Python
      • Python
    • Shell
      • Shell
  • wheels
    • dcc
      • 产品调研
      • 方案设计
    • red-envelope
      • 方案设计
    • short-url
      • 短链接服务
    • sso
      • 方案设计
Powered by GitBook
On this page
  • 文档:DOM中的“D”
  • 对象:DOM中的“O”
  • 模型:DOM中的“M”
  • 节点
  • 获取和设置属性
  • 小结
  1. blogs
  2. history

DOM

PreviousChrome开发者工具使用方法NextDjango Model模型层学习

Last updated 3 years ago

文档:DOM中的“D”

如果没有document(文档),DOM也就无从谈起。当创建了一个网页并把它加载到web浏览器中时,DOM就在幕后悄然而生。它把你编写的网页文档转换为一个文档对象。

对象:DOM中的“O”

JavaScript语言里的对象可以分为三种类型。

  • 用户定义对象(user-defined object):由程序员自行创建的对象。

  • 内建对象(native object):内建在JavaScript语言里的对象。

  • 宿主对象(host object):由浏览器提供的对象。

模型:DOM中的“M”

DOM中的“M”代表着“Model”(模型)。 就像一个模型火车代表一列真正的火车、一张城市街道图代表一个实际存在的城市那样,DOM代表着加载到浏览器窗口的当前页面。

节点

节点(node)这个词是个网络术语,它表示网络中的一个连接点。一个网络就是由一些节点构成的集合。 在DOM里有许多不同类型的节点,如元素节点、文本节点和属性节点。

元素节点

标签的名字就是元素的名字。文本段落元素的名字是“p”,无序清单元素的名字是“ul”,列表项元素的名字是“li”。

文本节点

在XHTML文档里,文本节点总是被包含在元素节点的内部。但并非所有的元素节点都包含有文本节点。在“购物清单”文档里,<p>元素包含着文本“Don't forget to buy this stuff.”。它是一个文本节点。<ul>元素没有直接包含任何文本节点,它包含着其他的元素节点(一些<li>元素),后者包含着文本节点。

属性节点

属性节点用来对元素做出更具体的描述。例如,几乎所有的元素都有一个title属性,而我们可以利用这个属性对包含在元素里的东西做出准确的描述。

CSS

DOM并不是与网页结构打交道的唯一技术。我们还可以通过CSS(层叠样式表)告诉浏览器应该如何显示一份文档的内容。 继承(inheritance)是CSS技术中的一项强大功能。类似于DOM,CSS也把文档的内容视为一棵节点树。节点树上的各个元素将继承其父元素的样式属性。 例如,如果我们为body元素定义了一些颜色或字体,包含在body元素里的所有元素都将自动获得那些样式:

body{
  color:white;
  background-color:black;
}

这些颜色将不仅作用于那些直接包含在<body>标签里的内容,还将作用于嵌套在body元素内部的所有元素。 为了把某一个或某几个元素与其他元素区别开来,需要使用class属性或id属性。 class属性 你可以在所有的元素上任意应用class属性:

<p class="special">This paragraph has has the special class</p>
<h2 class="special">So does this headline</h2>

在样式表里,可以为class属性值相同的所有元素定义同一种样式:

.special{
font-style: italic;
}

还可以像下面这样利用class属性为一种特定类型的元素定义一种特定的样式:

h2.special{
text-transform:uppercase;
}

id属性 id属性的用途是给网页里的某个元素加上一个独一无二的标识符:

<ul id="purchases">

在样式表里,可以像下面这样为有特定id属性值的元素定义一种独享的样式:

#purchases{
  border:1px solid white;
}

尽管id本身只能使用一次,样式表还是可以利用id属性为包含在改特定元素里的其他元素定义样式:

#purchases li{
  font-weight:bold;
}

获取元素

有三种DOM方法可获取元素节点,分别是通过元素ID、通过标签名字和通过类名字来获取。 1.getElementById 它是document对象特有的函数,返回一个与那个有着给定id属性值的元素节点对应的对象。注意大小写。

document.getElementById(id)

getElementById方法只有一个参数:你想获得的那个元素的id属性的值。这个id值必须放在单引号或双引号里。 例如:

document.getElementById("purchases")

2.getElementsByTagName getElementsByTagName方法返回一个对象数组,每个对象分别对应着文档里有着给定标签的一个元素。类似于getElementById,这个方法也是只有一个参数的函数,它的参数是标签名字:

element.getElementsByTagName(tag)

它与getElementById方法有许多相似之处,但它返回的是一个数组。 例如:

document.getElementsByTagName("li")

alert(document.getElementsByTagName("li").length)   //返回数组的长度

这个调用将返回一个对象数组,每个对象分别对应着document对象中的一个列表项元素。 有个简单办法可以减少不必要的打字量并改善代码的可读性:只要把document.getElementsByTagName("li")赋值给一个变量即可。 getElementsByTagName允许把一个通配符作为它的参数,而这意味着文档里的每个元素都将在这个函数所返回的的数组里占有一席之地。

alert(document.getElementsByTagName("*").length);   //返回文档里元素节点的总数

3.getElementsByClassName getElementsByClassName也只接受一个参数,就是类名:

getElementsByClassName(class)

这个方法的返回值也与getElementsByTagName类似,都是一个具有相同类名的元素的数组。 例如:

document.getElementsByClassName("sale")   //返回一个数组,其中包含类名为“sale”的所有元素

使用这个方法还可以查找那些带有多个类名的元素,只需在字符串参数中用空格分隔类名即可:

document.getElementsByClassName("important sale")   //同时带有“important”和“sale”类名的元素

4.小结 简要总结:

  • 一份文档就是一棵节点树

  • 节点分为不同的类型:元素节点、属性节点和文本节点等。

  • getElementById将返回一个对象,该对象对应着文档里的一个特定的元素节点。

  • getElementsByTagName和getElementsByClassName将返回一个对象数组,它们分别对应着文档里的一组特定的元素节点。

  • 每个节点都是一个对象。

获取和设置属性

getAttribute方法获取属性,setAttribute方法更改属性节点的值。

getAttribute

object.getAttribute(attribute)  //只有一个参数——你打算查询的属性的名字

它只能通过元素节点对象调用。例如,可以与getElementsByTagName方法合用,获取每个<p>元素的title属性:

var paras = document.getElementsByTagName("p");
for (var i=0;i<paras.length;i++){
	alert(paras[i]).getAttribute("title");
	}

setAttribute

object.setAttribute(attribute,value)

例如:

var shopping = document.getElementById("purchases");
shopping.setAttribute("title","a list of goods");       //设置title属性为a list of goods

这里有一个非常值得关注的细节:通过setAttribute对文档做出修改后,在通过浏览器的view source选项查看文档的源代码时看到的仍将是改变前的属性值,也就是说,setAttribute做出的修改不会反映在文档本身的源代码里。这种“表里不一”的现象源自DOM的工作模式:先加载文档的静态内容,在动态刷新,动态刷新不影响文档的静态内容。这正是DOM的真正威力:对页面内容进行刷新却不需要在浏览器里刷新页面。

小结

  • getElementById

  • getElementsByTagName

  • getElementsByClassName

  • getAttribute

  • setAttribute

这五个方法是将要编写的许多DOM脚本的基石。

DOM文档结构图