关于前端Dom的总结
- 简介
DOM (Document Object Model) 文档对象模型
DOM思想使用节点树(node tree)的概念来描述一个HTML页面,页面中的每一个元素、属性、文本都被认为是节点。此外,DOM还定义了一系列编程接口(DOM API),用来操作页面的任意一部分内容
在 js + DOM编程中,一般的编程思路是这样的:由js基本语法控制程序的执行逻辑,由DOM API进行元素的查找获取,进而再对元素进行增删改等操作
- 节点树
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title></title>
</head>
<body>
<a href="http://www.baidu.com">百度一下</a>
</body>
</html>
- 节点类型
HTML页面中的主要节点有四种:文档节点、元素节点、属性节点、文本节点
DOM API提供了一个Node父接口表示任意类型的节点,同时提供了两个子接口:Document、Element分别表示整个文档和元素节点(当然,还提供了其他类型的子接口,如DocumentType、Attr、Text等)
- document对象
document对象是window对象的一个属性
document对象表示整个HTML页面,是DOM的核心对象
document对象是连接JavaScript和DOM的桥梁,使得我们可以在JavaScript环境中操作页面内容
document对象提供了查找获取元素节点的方法,所以document是DOM的编程入口,此外还提供了创建新节点的方法
- document获取元素
document对象提供了3个方法来查找获取想要的元素对象:
方法名 |
返回值 |
描述 |
getElementById(string) |
Element |
根据元素的id属性值获取元素 |
getElementsByTagName(string) |
NodeList |
根据元素的标签名获取元素 |
getElementsByName(string) |
NodeList |
根据元素的name属性值获取元素 |
NodeList操作
获取NodeList中包含的元素个数 nodeList.length
获取指定索引位置的元素nodeList.item(index)
注意:NodeList是动态更新的,即如果删除的元素也在NodeList里面,那么也同时从NodeList里面删除
- document操作元素
创建元素、添加元素
document.createElement(tagName) 根据元素标签名称创建元素节点
appendChild(node) 添加子节点
注:如果一个元素原本就在页面中,appendChild会先把元素从原来的父元素删除,再追加到新的父元素中(因为要添加的那个节点不一定是新创建的,可能是获取到页面中的一个节点)
- Element操作元素属性
直接使用element.attrName的方式操作属性值
以下方式只能操作HTML标准规定的属性,不能操作自定义属性
var attrValue = element.attrName;//获取属性值
element.attrName = attrValue;//给属性赋值
element.className;//获取和设置元素的class属性的值。因为class是关键字,所以操作class属性时使用className代替
在js中,操作checkbox、radio的checked属性,select的selected属性值时,使用true或false , 表单元素的disabled属性也是如此
通过方法操作属性
Element提供了3个方法来操作属性,而且可操作自定义属性
String getAttribute(String attrName) 获得属性值
void removeAttribute(String attrName) 删除指定属性
void setAttribute(String attrName, String attrValue) 修改/添加属性
- Element操作元素的子节点
子节点包括子元素和元素文本内容
element.getElementsByTagName() 根据子元素的标签名获取子元素
element.innerHTML 以字符串形式操作子节点
element.insertBefore(newNode, node) 在指定子节点前插入新子节点
element.appendChild(newNode) 在最后追加子节点
element.parentNode 获取元素的父元素
也可以使用element.innerText (IE、chrome)或者element.textContent(火狐)操作元素的文本内容(文本内容可以写成html代码字符串),但有浏览器兼容问题。
- Element操作元素样式
使用 element.style.propName 的方式可以直接操作某个样式属性。如:element.style.backgroundColor="gray";
使用DOM和CSS操作元素样式的名称使用对比如下图
- 删除元素内容
element.removeChild(node); 删除子节点
element.attrName = null; 删除属性
element.innerHTML = null; 删除文本内容和子元素
- DOM事件机制
通常的,当浏览器状态改变、用户操作时都会触发一些事件。如用户点击了一个按钮,就触发了按钮的点击事件,按钮称为事件源。
当一个事件被触发时,浏览器就会创建一个event事件对象,这个事件对象包含和此事件相关的各种信息,如点击事件的事件对象包含点击位置的信息,可供编程人员使用。
如果希望当一个事件发生时针对这个事件做一些处理,就需要给该事件注册一个事件处理函数,当该事件真的发生时,该处理函数就会被浏览器自动调用
常见的事件有以下几类:窗体事件、鼠标事件、键盘事件、焦点事件等
页面加载完成事件
操作页面元素的js代码一定要写到页面加载完成里面,否则可能会因为没有加载完成导致元素取不到。如下是事件的基本用法:
<script type="text/javascript">
window.onload=function(){
//只有页面加载完成,才可确保id为div01的元素被获取到
var element = document.getElementById("div01");
alert(element);
}
</script>
注意:load是事件的名称,onload是元素的属性,用来给元素注册事件处理函数
鼠标事件
click、dblclick 鼠标单击、双击时触发
mouseover、mouseout 鼠标指针进入、离开元素时触发
mousemove 鼠标指针移动时触发(进入元素后)
mousedown、mouseup 鼠标按键按下、弹起时触发(进入元素后)
鼠标事件的event对象包含如下信息:
button 点击的哪个鼠标按键(0、1、2)
altKey、ctrlKey、shiftKey 点击时是否同时按下键盘的alt、ctrl、shift 键
clientX、clientY 鼠标指针的窗口坐标
screenX 、screenY 鼠标指针的屏幕坐标
处理事件的两种方式
1、通过DOM方式把事件处理函数赋值给事件属性(称为注册事件处理函数)
<script type="text/javascript">
window.onload=function(){
var element = document.getElementById("div01");
element.onclick = function(){
alert("点我了");
}
}
</script>
2、直接在HTML元素标签的事件属性上写要执行的代码
<div onclick="alert('点我了');" ></div>
3、注意:如果有个自定义函数fun1,第一种方式的写法为element.onclick=fun1;而第二种方式的写法为onclick="fun1();"
- this的使用
function fun1(){
alert(this);
} onload = function(){
var obj = {"fun1":fun1 };//obj.fun1 = fun1;
var btn = document.getElementById("btn");
btn.onclick = fun1;
window.fun1(); //Window
obj.fun1(); //Object
btn.onclick(); //HTMLInputElement
}
说明:如果this在函数fun1内,函数fun1以哪个对象的属性值的身份去执行,this就表示哪个对象。this的这个特性,很多时候非常有用,特别是在DOM的事件处理函数中
- 给一个事件注册多个事件处理函数
注册事件处理函数的方式会覆盖直接编写处理代码的方式,而且同时注册的多个处理函数也会发生覆盖,这就导致一个事件发生时我们只能做"一件事情"
为了可以给一个事件注册多个事件处理函数,DOM提供了另外一种注册方式:
addEventListener(事件名称, 处理函数);
同时提供了一个删除处理函数的方法:
removeEventListener(事件名称, 处理函数);
也可以使用代码模拟触发一个事件,如btn.onclick();,其实这只是直接调用了事件处理函数
注意:多次注册同一个函数效果只有一次。如果希望将来可以删除某个注册的处理函数,就应该拿到该处理函数的引用
<script type="text/javascript">
window.onload=function(){
document.getElementById("div01").addEventListener("click",function(){
alert(2);
})
}
</script>
- 事件冒泡
由于HTML元素可嵌套,就不可避免的出现当用户执行一个动作如点击时,会有多个元素触发点击事件。为了方便管理不至于混乱,DOM提供了事件冒泡机制。
事件冒泡:当若干嵌套的元素"同时"被触发某个事件时,最内层元素的事件最先被触发,事件依次往外传递。
如果某刻希望取消该事件的冒泡,可以使用event.stopPropagation()
- 键盘事件
keydown 键盘按键被按下
keyup 键盘按键被弹起
event事件对象的属性:
event.keyCode 被按下的按键的整数编码
<script type="text/javascript">
window.onload=function() {
document.onkeydown = function () {
alert(event.keyCode);//获取按下键的整数编码
}
}
</script>
- 取消浏览器的默认动作
对于某些元素的特点事件,浏览器会有一个默认的动作,如超链接触发点击事件时页面会跳转、表单提交事件被触发时表单数据会被提交到服务器、键盘按下在输入框中输入字符等
DOM提供了两种方式来取消浏览器的默认动作:在我们自己注册的处理函数中执行 event.preventDefault(); 或者return false;
注意:取消事件的浏览器默认动作和取消事件冒泡是不同的概念
关于前端Dom的总结的更多相关文章
- Python之Web前端Dom, jQuery
Python之Web前端: Dom jQuery ###Dom 一. 什么是Dom? 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它 ...
- 前端---DOM
一.介绍: http://www.cnblogs.com/wupeiqi/articles/5643298.html 什么是DOM? DOM字面意思是文档对象模型,DOM将网页内的元素与内容呈现为一个 ...
- 前端dom元素的操作优化建议
参考自:http://blog.csdn.net/xuexiaodong009/article/details/51810252 其实在web开发中,单纯因为js导致性能问题的很少,主要都是因为DOM ...
- python学习之路前端-Dom
Dom简介 文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为 ...
- web前端 DOM 详解
先来点概念 文档对象模型(DOM)是一个独立于语言的,使用 XML 和 HTML 文档操作的应用程序接口(API). 在浏览器中,主要与 HTML 文档打交道,在网页应用中检索 XML 文档也很常见. ...
- 前端——DOM
什么是DOM? DOM是W3C(万维网联盟)的标准,是Document Object Model(文档对象模型)的缩写,它定义了访问HTML和XML文档的标准: “W3C文档对象模型(DOM)是中立于 ...
- 前端 Dom 直接选择器
文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...
- 前端DOM知识点
DOM即文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.DOM把网页和脚本 ...
- 前端dom操作竟然使得http请求的时间延长了
最近在项目中遇到了一个奇怪的问题:在google浏览器的调试窗口network下看到一个请求的时间一直是2s多,但是当我把这个请求单独拿出来执行的时候发现根本用不了2s,100多毫秒就完成了.最后再不 ...
随机推荐
- 【STM32H7教程】第48章 STM32H7的FMC总线应用之是32路高速IO扩展
完整教程下载地址:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980 第48章 STM32H7的FMC总线应用之是32路 ...
- UNION和UNION ALL的作用和语法
主要就是两句话区别: union是联合的意思,就是合并两个或多个select语句的结果集,并消除重复行: union all 当然也是联合的意思,也是合并两个或多个select语句的结果集,但是保留重 ...
- Elasticsearch分布式搜索
ElasticSearch之介绍 一 Elasticsearch产生背景 1.1 大规模数据如何检索 如:当系统数据量上了10亿.100亿条的时候,我们在做系统架构的时候通常会从以下角度去考虑问题:1 ...
- 2020/2/12 PHP编程学习
感冒终于差不多好了.. 学了一天的tp框架商城开发,到此,一个小商城算是开发完了,写一个简单小总结吧233 首先说的编程方面,其实并没有质的提升orz,怎么可能几天就有大突破233 不过收获还是有的, ...
- POJ - 3662 Telephone Lines (dijstra+二分)
题意:有N个独立点,其中有P对可用电缆相连的点,要使点1与点N连通,在K条电缆免费的情况下,问剩下的电缆中,长度最大的电缆可能的最小值为多少. 分析: 1.二分临界线(符合的情况的点在右边),找可能的 ...
- 每天一点点之vue框架开发 - axios拦截器的使用
<script> import axios from 'axios' export default { name: 'hello', data () { return { msg: 'We ...
- ref与out区别
ref与out out.ref都是传递引用(内存地址),使用后都将改变原来参数的数值. ref 当调用方法时,在方法中会对ref传入的参数数值进行改变,若使用ref参数,则方法定义和调用方法都 ...
- sping中 各种注解——@SuppressWarnings注解用法
@SuppressWarnings注解用法 @SuppressWarnings注解主要用在取消一些编译器产生的警告对代码左侧行列的遮挡,有时候这会挡住我们断点调试时打的断点. 如图所示: 这时候我们在 ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习: 表单验证
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- JAVA课程设计——俄罗斯方块(团队)
1.团队介绍 1.1 团名:终于可以回家了嗷嗷嗷 1.2 团员介绍 2.参考来源 https://www.jb51.net/article/142716.htm 3.项目git地址 https://g ...