前端(五)DOM 文档对象模型

文章介绍了JavaScript中DOM的概念,包括DOM树、DOM对象的获取与操作,如querySelector和getElementById等方法。还详细讲解了事件监听,如事件类型、事件对象和事件流,以及如何阻止冒泡。此外,讨论了节点操作,如创建、查找和删除节点的方法。
摘要由CSDN通过智能技术生成

注:变量声明尽量用const,const语义化更好,发现变量需要修改(修改值,而非地址)时再改为let(可以重新赋值),var很少用。简单数据类型。(值经常改变时用let)

下面假装我们javascript基础语法学习得很好。

目录

来看看DOM:

1.1 WEB API

1.2 DOM树:将html文档以树状的结构表现出来,称之为文档/DOM树。

1.3 DOM对象:

1.3.1 获取DOM元素:

1.3.2 操作元素属性:常用属性

1.4 事件监听:

1.4.1 事件:在编程时系统内发生的动作或者发生的事情。比如用户在网页内单击按钮。

1.4.2 事件类型:

1.4.3 事件对象:

1.4.4 事件流:

1.5 DOM节点操作:

1.5.1 节点类型:

1.5.2 查找节点:

1.5.4 增加节点:


来看看DOM:

1.1 WEB API

:(应用程序接口 Application Programming Interface)是基于编程语言构建的结构,它提供了一些简单的接口直接使用,就像为想插电的人提供插座,而不是直接连接到电线上。JS中的WEB API主要针对DOM(文档对象类型)BOM(浏览器对象类型)提供了一些封装的方法。

文档对象模型 (DOM) 是 HTML 和 XML 文档的编程接口。

DOM 将文档解析为一个由节点和对象(包含属性和方法的对象)组成的结构集合。简言之,它会将 web 页面和脚本或程序语言连接起来。

作用:使用js去操作html和浏览器。

1.2 DOM树:将html文档以树状的结构表现出来,称之为文档/DOM树。

直观的体现了标签与标签之间的关系。


 

 

文档:在DOM中document表示,是最大的一级。

元素:在DOM中element表示,html是所有元素的根元素。

节点:HTML 文档中的所有内容都是节点:整个文档是一个文档节点. 每个 HTML 元素是元素节点. HTML 元素内的文本是文本节点. 每个 HTML 属性是属性节点. 注释是注释节点,等等。

1.3 DOM对象:

浏览器根据HTML标签生成的js对象。

所有的标签属性都可以在这个对象上找到。修改这个对象的属性会自动映射到标签上。

document对象:是DOM里提供的“最大的”一个对象。它提供的属性和方法都是用来访问和操作网页内容的,网页所有内容都在它里面。

除非特殊强调:括号里类名前一定要加点!!!!

1.3.1 获取DOM元素:

  1.  根据CSS选择器来获取DOM元素。
1.
const name = document.querySelector(‘CSS选择器’)
//(只获取匹配到的第一个元素,第一个HTML element对象)

//更多:
const li = document.querySelector(‘ul li:first-child’);//后代选择器

//选择所有的:
const li = document.querySelectorAll(‘ul li’);

//打印所有的li,以数组的形式。

//选择一个元素后可以修改。多个元素以数组形式出现,遍历修改。
2.
document.getElementById("id");//用ID获取对象,只能用在document上,查找一个
document.getElementByName("name属性值");
parent.getElementByTagName("tag");
//按标签名可以查找,控制台查看属性可以看到TagName
//可以查子代所有节点,返回一个伪数组,用下标取出元素

修改对象内容:

  1. 获取元素内容
  2. 修改文字内容 :对象.innerText 属性 :inner Text可以将文本添加/更新到任意标签位置,但只显示纯文本,不解析标签。//空格和换行会去掉。
  3. .innerHTML属性:会解析标签,多标签建议用模版字符。
//注:取n-m的随机整数 

function getRandom(n,m){

return Marh.floor(Math.random()*(m-n+1))+N;

}

const random=getRandom(1,6);
//注:随机数:
const random = Math.floor(Math.random()*数组名.lenth);
random每次生成一个随机数本身是重新定义了初始值而不是改变原有的值,不算变量改变。(局部时以前的变量用完被回收)

1.3.2 操作元素属性:常用属性

获取属性:

//获取属性方法

1.样式属性:

style:对象.style.属性 =新值;生成行内样式,权重高。

如果属性有-连接符,需要转换为小驼峰命名法:borderTop:修改上边框,记得加单位。

类名:元素.className = ‘类名’

由于class是关键字,用className代替。(使用新值换旧值,如果需要添加一个类,要保留之前的类名。)

先通过CSS写出一个类,在通过js把类添加到属性里,调用。而且会把原有的类名覆盖。

如果前面类名和后加类名都用,引号中间写两个类名,空格隔开。

通过classList操作类:不覆盖,只追加/删除

元素.classList.add(‘类名不加点,而且是字符串’)

元素.classList.remove(同上)//删除

toggle()//切换:有就删掉,没有就加上

2.操作表单属性:

获取表单值:直接console.log(元素.value);

文本框变成密码框:元素.type = ‘password’;

设置全选按钮:1.获取元素 2.元素.checked = true(遍历,把每个都改成true,只接受布尔值)

按钮点击后失效:1.获取元素 2.disabled属性:禁用吗? 默认false:不禁用。改成true即禁用。

3.操作自定义属性:

自定义属性:data-属性名:(HTML5中规定)

获取:

1.element.setAttribute("data-index",0);
2.元素名.dataset.属性名

目的:是为了保存并使用数据,有些数据可以保存到页面中而不用保存到数据库中,使用起来会比较方便。

4.定时器:

间歇函数:定时器返回的是一个ID数字

开启:setInterval(函数(只写函数名,不加括号),间隔时间)作用:每隔一段时间调用这个函数,间隔时间单位是ms;执行到第一次打印有空窗期,空窗期为间隔时间。

关闭:因为每个定时器的序号都是独一无二的,需要let 对象名=获取

clearInterval(对象名)

再开:对象名 = setInterval(之前的数据)

button按钮特殊,用innerHTML获取元素。

1.4 事件监听:

1.4.1 事件:在编程时系统内发生的动作或者发生的事情。比如用户在网页内单击按钮。

事件监听:让程序检测是否有事件产生,一旦触发,就立即调用一个函数来响应。也称为绑定事件或注册事件。

语法:元素对象.addEventListener(‘事件类型’,要执行的函数)每次触发,每次执行。此种方法多次事件不会被覆盖。

事件监听三要素:事件源,事件类型,事件处理程序(调用的函数)。

事件源:那个dom元素被事件触发了,要获取dom元素

事件类型:用什么方式触发

1.4.2 事件类型:

鼠标事件:鼠标触发:click 鼠标点击 mouseenter鼠标经过 mouseleave鼠标离开

焦点事件:表单获得光标:focus 获得焦点 bur 失去焦点

键盘事件:键盘触发:keydown 键盘按下触发 keyup键盘抬起触发

文本事件:表单输入触发:input用户输入事件

1.4.3 事件对象:

里面有事件触发时的相关信息,可以判断用户键盘按下了那个键,鼠标点击了哪个按钮等。

语法:获取事件对象:在事件绑定的回调函数的第一个参数就是事件对象。

事件对象常用属性:type:获取当前事件类型 clientX/Y:获取光标相对于浏览器可见窗口左上角的位置。

offsetX/Y:获取光标相对于当前DOM元素左上角的位置。

key:用户按下键盘键的值。

环境对象:指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。

使代码更简洁。

this指向被调用者。谁调用,this就指谁。

函数调用方式不同,this指代对象也不同。

回调函数:如果函数作为调用参数被另一个函数调用,他就是回调函数。

1.4.4 事件流:

事件完整执行过程中的流动路径:事件捕获(从大到小)和事件冒泡(从小到大)

事件冒泡:当一个元素的事件被触发时,同样的事件会在该元素的所有祖先中依次被触发。(当一个元素触发事件后,会依次向上调用所有父级元素的同名事件)

调用:事件监听第三个参数为false或者不添加此参数默认冒泡。

阻止冒泡:(大多数是默认冒泡存在导致影响到父级元素)把事件限制在当前元素内。

前提:拿到事件对象。

语法:事件对象.stopPropagation()

事件解绑:元素.removeEventListener(事件类型,事件处理函数名)匿名函数不能被解绑。

moreover与mouse enter的区别:

mouseover mouseout 有默认冒泡效果

mouseenter mouseleave 没有默认冒泡效果

事件委托:

优点:减少注册次数,提高程序性能

原理:事件委托利用冒泡事件的特点,给父元素注册事件,触发父元素时会冒泡到父元素身上,从而触发父元素事件

实现:事件对象.target.tagName可以获得真正触发事件的元素。

阻止默认行为的发生:比如阻止链接的跳转,表单域跳转

语法:e.preventDefault()

其他事件:

页面加载事件:

等到所有资源加载完毕以后执行事件,也可以针对某个资源绑定。事件名:load(监听页面所有资源加载完毕)

给window添加:window.load

当初始的HTML文档被完全加载和解析后,DOMContentLoaded事件触发,不需要等待样式表和图像等完全加载。

document.addEventListener(‘DOMContentLoaded’,function(){})

元素滚动事件:元素滚动时触发的事件。

事件名:scroll 给window或document添加

获取滚动位置:

scrollLeft和scrollTop(新版scrollY):可读写

可以获得(滚动条向下拉,页面朝上走)朝上走的长度。

获取HTML元素:document.documentElement

相对于整个页面:document.documentElement.scrollTop

页面尺寸事件:在窗口尺寸改变时触发事件

属性:resize

检测屏幕尺寸:clientWidth clientHeight不包含边框boder,滚动条。包括padding。

获取元素位置,尺寸:

获取宽高:元素的自身宽高,padding,border。

属性名:offsetWidth和offsetHeight 包含边框。

获取位置:只读属性。获取元素距离自己定位的父级元素的左,上距离。

属性:offsetLeft和offsetTop。找父级元素,以定位的为准,父元素没有定位再往上找。

111,113,114,115,116,117,118;

1.5 DOM节点操作:

DOM节点:DOM树里的每一个内容都称为节点。

一般来说,节点至少有nodeType 节点类型,nodeName 节点名称,nodeValue 节点值这几个基本属性。

1.5.1 节点类型:

元素节点:所有的标签,html是根节点。

属性节点:所有的属性

文本节点:所有的文本

1.5.2 查找节点:

父节点查找:返回最近一级的父元素。子节点.parentNode。找不到则返回null。

子节点查找:

childNotes:获得所有子节点,包括文本节点(空格,换行),注释节点。

children属性:仅获得所有元素节点,返回的是一个伪数组。父元素.children。只获得下一级所有子元素。只读属性。

父元素.firstChild 返回第一个子节点。

父元素.lastChild 返回最后一个子节点。

兄弟关系查找:

下一个兄弟节点:nextElementSibling属性 只选元素

上一个兄弟节点:previousElementSibling属性

1.5.4 增加节点:

先创造节点:即新创造一个元素,再添加到网页内。一般是先创建节点,再插入节点

方法:变量 = document.createElement(‘标签名’)

追加节点:父元素.appendChild(变量)//插入变成最后一个子元素。类似于伪元素。

插入到某个子元素前面:父元素.insertBefore(要插入的元素,第几个元素前面)

克隆节点:元素.cloneNode(布尔值)布尔值为true,克隆时包含后代节点(标签及内容等)。false:不包含。

默认为false。

删除节点:通过父元素删除。父元素.removeChild(要删除的元素)

如果不存在父子关系则不能删除。是从html里删除掉而非隐藏。

三种动态创建元素区别
1. document.write 是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘
2. innerHTML 是将内容写入某个 DOM 节点,不会导致页面全部重绘
且innerHTML 创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
4. createElement() 创建多个元素效率稍低一点点,但是结构更清晰
总结:不同浏览器下,innerHTML 效率要比 creatElement 高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值