1. DOM对象认识
1.1 什么是DOM对象
DOM模型的全称是:Document Object Model, 即:文档对象模型,它定义了操作文档对象的接口。
WEB页面的HTML文档,document就是根节点,其它的子对象就是子结点.
DOM模型在AJAX开发中的作用
在ajax中,DOM模型其实是最核心的结构,是所有ajax开发的基础架构.如果没有DOM模型,就没有办法在客户端改变页面的内容,所有的局部刷新,异步请求也就无从实现。熟练掌握DOM模型的相关技术,才算真正掌握了ajax开发精髓。
1.2 浏览器装载和显示页面的过程
1. 下载源代码
2. 通过页面源代码加载相关内容到内存,也就是根据HTML源码在内存中构建相关DOM对象。
3. 根据DOM对象的相关属性,来进行显示。
1.3 DOM节点分类node
1.3.1 节点的概念
在DOM模型中,整个文档就是由层次不同的多个节点组成,可以说结点代表了全部内容。
1.3.2 节点的类型
元素结点、文本结点和属性结点
hello DOM!
文本节点和属性结点都看作元素结点的子结点
我们一般所说的结点指的就是元素结点。
1.3.3 节点的基本属性
nodeName:元素结点返回结点类型(即,标记名称);属性结点返回属性名称,文本节点返回"#text".
nodeType:元素节点返回1,属性节点返回2,文本节点返回3
nodeValue:元素节点返回null, 属性节点返回属性值, 文本结点返回文本值。
1.4 DOM节点关系
浏览器在解析文档之前会将文档读取到内存形成DOM树,树形节点存在相关层级关系,常用关系如下所示:
根节点(root): 所有节点的顶层节点
父子节点(parent-child): 元素作为父级,
和 元素作为子级兄弟节点(Sibling): 和 元素就是兄弟关系;
元素并不是兄弟关系
叶子节点: 没有任何子节点的节点
空节点: 没有任何内容的节点
2. DOM对象的获取
2.1 获取元素节点对象
1.使用document.getElementById()引用指定id的结点
// 需求: 点击按钮实现通过id获取p节点以及节点的信息function getNodeById() { var pNode = document.getElementById("p"); console.log(pNode); console.log("nodeName: " + pNode.nodeName + ",nodeValue: " + pNode.nodeValue + ",nodeType: " + pNode.nodeType); }
2. 使用
document.getElementsByClassName(“hello”)将所有class属性为”hello”的元素结点放到一个数组中返回
function getNodeByClassName() { var pNodes = document.getElementsByClassName("hello"); for (var i = 0; i < pNodes.length; i++) { var pNode = pNodes[i]; console.log(pNode); console.log("nodeName: " + pNode.nodeName + ",nodeValue: " + pNode.nodeValue + ",nodeType: " + pNode.nodeType); } }
3. 使用
document.getElementsByTagName(“a”),将所有元素结点放到一个数组中返回。
function getNodeByTagName() {var aNodes = document.getElementsByTagName("a"); for (var i = 0; i < aNodes.length; i++) { var aNode = aNodes[i]; console.log(aNode); console.log("nodeName: " + aNode.nodeName + ",nodeValue: " + aNode.nodeValue + ",nodeType: " + aNode.nodeType); } }
4. 使用
document.getElementsByName(“gender”),将所有name属性为”gender”的元素结点放到一个数组中返回。
function getNodeByName() { var radios = document.getElementsByName("gender"); for (let i = 0; i < radios.length; i++) { var radio = radios[i]; console.log(radio); console.log("nodeName: " + radio.nodeName + ",nodeValue: " + radio.nodeValue + ",nodeType: " + radio.nodeType); } }
2.2 间接获得元素对象
间接引用节点
1.引用子结点
每个结点都有一个childNodes集合属性,类型是数组对象,表示该结点的所有子结点的集合。这些子结点按照它在文档中出现的顺序排列,因此可以通过索引来依次访问各个子结点。
firstChild: 获取第一个子节点
lastChild: 获取最后一个子节点
2.引用父节点
DOM模型中,除了根结点,每个结点都仅有一个父节点,可以用parentNode属性来引用。
3. 引用兄弟结点
element.nextSibling; //引用下一个兄弟结点
element.previousSibling; //引用上一个兄弟结点
如果该结点没有相应的兄弟结点,则属性返回null.
案例: 根据以下HTML结构,实现DOM节点相关操作:
白日依山尽
黄河入海流
欲穷千里目
更上一层楼
1. 通过父节点获取子节点
function getNodeByParent() {// 1. 获取父节点 var parentNode = document.getElementById("parent"); // 2. 通过父节点获取所有子节点 var childNodes = parentNode.childNodes; console.log("chiledNodes: " + childNodes.length); console.log("childElementCount: " + parentNode.childElementCount); // 3. 遍历输出所有的子节点 for (var i = 0; i < childNodes.length; i++) { var childNode = childNodes[i]; console.log("==> 第" + (i + 1) + "个节点: ") console.log(childNode); console.log("nodeName: " + childNode.nodeName + ",nodeValue: " + childNode.nodeValue + ",nodeType: " + childNode.nodeType); } // 4. 获取第一个节点和最后一个节点 console.log(parentNode.firstChild); console.log(parentNode.lastChild); console.log(parentNode.firstElementChild); console.log(parentNode.lastElementChild); console.log("======================="); var childNodes = parentNode.children; for (var i = 0; i < childNodes.length; i++) { var childNode = childNodes[i]; console.log(childNode); } }
2. 通过子节点获取父节点
function getNodeBySon() {var p2Node = document.getElementById("p2"); // 获取父节点 var parentNode = p2Node.parentNode; console.log(parentNode); console.log(p2Node.parentElement); }
3. 通过某个节点获取兄弟节点
function getNodeByBrother() {var p2Node = document.getElementById("p2"); // 获取紧邻的下一个节点 console.log(p2Node.nextSibling); // 获取紧邻的下一个元素节点 console.log(p2Node.nextElementSibling); // 获取紧邻的上一个节点 console.log(p2Node.previousSibling); // 获取紧邻的上一个元素节点 console.log(p2Node.previousElementSibling); }
3. DOM操作元素的属性
元素结点.属性名称(可以读写属性值)
使用setAttritbute(), getAttribute()添加和设置属性
代码示例如下:
DOM操作属性 设置节点的属性
4. DOM操作元素内容
当标签获得值的时候使用value属性
双标签获得值的时候使用的是innerHTML或者innerText
双标签的特殊情况(value)
Select/textarea
取值的时候使用value属性
赋值的时候使用innerHTML或者innerText即可
要获取一个结点内的文本,一般使用innerHTML属性
innerHTML属性不局限于操作一个结点,而是可以使用HTML片段直接填充页面或直接获取HTML片段,大大提高了开发的灵活性。
InnerText节点的属性:
获取: 获取的是文本,不会获取标签
设置: 都是文本,浏览器不会解析里面包含的html标签
相关代码如下所示:
Document 标签
简介: 家乡:
5. DOM操作样式
1.通过style对象改变节点的CSS
利用style对象来控制元素的css, 每个style对象对应为该元素指定的css, 而每个css属性都对应于style对象的属性。
对于单个单词的css属性,在style对象中的属性名称不变,但对于双单词或多单词的属性改写为骆驼写法。例如:css中的font-size对应style属性为fontSize.
2.使用className属性指定结点样式
结点的className属性对应于css中的类选择器。
相关代码如下所示:
21.DOM对象操作样式 Hello Xyr
6. DOM操作节点
使用document.createElement方法创建元素结点
var divElement = document.createElement(“div")
使用appendChild方法添加结点
parentNode.appendChild(childElement);
使用insertBefore方法插入子结点
parentNode.insertBefore(newNode, beforeNode)
使用removeChild方法删除子结点
parentNode.removeChild(childNode);
使用replaceChild方法替换子结点
parentNode.replaceChild(newNode, childNode);
使用cloneNode方法克隆节点,传入true表示深拷贝
node.cloneNode(true);
相关操作代码如下所示:
Document
7. JavaScript操作表单
7.1 获取表单对象的方法
利用表单在文档中的索引或表单的name属性来引用表单
docuemnt.getElementById 通过id获取表单对象
document.formName 通过document对象的表单name属性获取表单对象
document.forms[i] 通过文档的foms属性得到所有的表单对象,返回表单的数组,通过索引获取对应的表单对象
document.forms[formName] 通过文档的foms属性得到所有的表单对象,返回表单的数组,通过表单name属性获取对应的表单对象
代码如下所示:
7.2 获取表单常用属性
表单常用属性如下表所示:
属性 | 描述 |
action | 返回或者设置action属性 |
elements | 获取一个数组,包括该表单中所有的表单域 |
length | 返回表单的表单域的数量 |
method | 返回或设置表单的method属性 |
name | 返回或设置表单的name属性 |
代码示例如下所示:
// 获取表单属性function getFormAttr() { var loginForm = document.getElementById("login");// 获取表单的action属性 console.log(loginForm.action); // 获取表单的长度 console.log(loginForm.length); // 获取表单的method属性 console.log(loginForm.method); // 获取所有表单域对象,返回的是一个数组 var forms = loginForm.elements; for(var i = 0; i < forms.length; i++) { var form = forms[i]; console.log(form); } }
运行结果如下图所示:
7.3 表单对象的常用方法
表单常用方法如下表所示:
方法 | 描述 |
submit() | 相当于单击submit按钮,表示表单提交到指定页面 |
reset() | 相当于单击reset按钮,表示所有表单域到初始值 |
代码示例如下所示:
// 提交表单function submitForm() { var loginForm = document.getElementById("login"); loginForm.submit(); }// 重置表单function resetForm() {var loginForm = document.getElementById("login"); loginForm.reset(); }
7.4 form表单的常用事件属性
表单常用事件属性如下表所示:
事件 | 描述 | |
onsubmit | 在表单提交之前触发 | |
onreset | 在表单被重置之前触发 |
注意:
1.表单点击提交会触发onsubmit事件,执行的函数需要给出返回值,返回true表示可以提交数据,返回false,表示不能提交数据
2.其中onsubmit属性的属性值return关键字不能省略,如果省略的 返回结果为false,还会提交数据和页面跳转。
3.reset表示重置到初始的状态,而不是清空。
7.5 form中表单域对象的获取
可以通过如下三种方式获取:
通过id获取表单域
通过表单的name来获取
form.elements[i]; 表单的元素下标来获取
代码示例如下所示:
function getFormField() { // 通过id获取表单域 var accountNode = document.getElementById("accountId"); console.log(accountNode); // 通过表单的name来获取 var loginForm = document.getElementById("login"); var accountNode2 = loginForm.account; console.log(accountNode2); // form.elements[i]; 表单的元素下标来获取 var accountNode3 = loginForm.elements[0]'' console.log(accountNode3); }
7.5 form表单域组件常用属性和方法.
disabled :使表单域不能接受用户的操作,变为只读
readonly: 内容不可以更改,变为只读
name :获取或设置表单域的名称
form:获取该表单域所属的表单
value:获取或设置表单域的值
type :判断表单域的类型
focus():使表单域获得焦点
blur():使表单域失去焦点
注意:
1. 设置readonly属性的时候only首字母需要大写才能生效
2. 一个页面只能够有一个组件设置为获得焦点
3. blur方法常用于在失去焦点时进行表单校验,部分代码如下所示:
readonly和disabled的区别?
共同点:都是导致内容不可以更改
区别:
readonly:中的内容是可以提交的
disabled:数据是不可以提交的,不可以在被操作
代码示例如下所示:
7.6 单选按钮组和复选框常用操作
通过checked属性获得选中和未选中的状态。
获得单选按钮组的值:只能通过遍历单选按钮来获取被选中的值
复选框的处理类似单选按钮
获取所有单选按钮或者复选按钮对象使用getElementByName("name")
使用复选按钮实现全选和反选效果图如下所示:
代码示例如下所示:
DOM操作单选和复选按钮 性别: 男 女
爱好:
全选/全不选
7.7 下拉列表的使用
常用属性的使用
使用value属性获取和设置下拉列表选中选项的值
使用selectedIndex属性获取当前被选中选项的索引
使用options属性获取所有选项集合
使用option对象的value属性和text属性, 可以读写这两个属性。
使用option对象的selected属性选中该option
示例代码如下所示:
家乡:
我们也可以通过下拉选项框对象的appendChild方法或者add方法添加option节点,代码如下所示:
function addMyOption() { // 1. 获取到select节点 var selectNode = document.getElementById("city"); // 2. 创建一个option var opt = document.createElement("option"); // 3. 设置option节点属性 opt.value = "cq"; opt.text = "重庆"; // 4. 将opt添加到select节点中 selectNode.add(opt); }
案例: 使用下拉选项框实现左选和右选添加的案例,效果图如下所示:
示例代码如下所示:
二级联动案例如下所示:" />
>" />
三级联动
2021-09-10 升学就业帮发布了 《给想进大厂的程序员提出一些建议》的文章
2021-08-20 升学就业帮发布了 《MyBatisPlus中的CRUD》的文章
2021-08-18 升学就业帮发布了 《MyBatis Plus 的框架搭建》的文章
2021-08-18 升学就业帮发布了 《为什么使用MyBatis Plus?》的文章
2021-08-13 升学就业帮发布了 《JQuery操作元素属性详解!什么是属性呢?》的文章