JS -DOM

DOM

1. DOM 介绍

DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方法。
当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。
HTML DOM 模型被构造为对象的树。
在这里插入图片描述
节点父、子和同胞

我们常用父(parent)、子(child)和同胞(sibling)等术语来描述这些关系。
父节点拥有子节点。
同级的子节点被称为同胞(兄弟或姐妹)。
在节点树中,顶端节点被称为根(root)。
每个节点都有父节点、除了根(它没有父节点)。
一个节点可拥有任意数量的子节点。
同胞是拥有相同父节点的节点。

DOM 作用

文档节点(document对象):   代表整个文档
元素节点(element 对象):   代表一个元素(标签)
文本节点(text对象):	    代表元素(标签)中的文本
属性节点(attribute对象):  代表一个属性,元素(标签)才有属性
注释节点(comment对象):    代表注释
JavaScript 能够改变页面中的所有 HTML 元素
JavaScript 能够改变页面中的所有 HTML 属性
JavaScript 能够改变页面中的所有 CSS 样式
JavaScript 能够对页面中的所有事件做出反应

2. Document 对象

当浏览器载入 HTML 文档, 它就会成为 Document 对象。
Document 对象是 HTML 文档的根节点。
Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。

常见 Document 方法或属性说明
document.getElementById根据 id 获取一个标签
document.getElementsByName()返回带有指定 name 的对象集合。
document.getElementsByClassName根据 class 属性获取对象集合。
document.getElementsByTagName根据标签名获取标签合集
document.body返回文档的body元素
document.forms返回对文档中所有 Form 对象引用。
document.images返回对文档中所有 Image 对象引用。
document.title返回当前文档的标题。
document.URL返回文档完整的URL
document.write()向文档写 HTML 表达式 或 JavaScript 代码。
document.createElement()创建元素节点。
document.createTextNode()创建文本节点。
document.createAttribute()创建一个属性节点
document.createComment()创建一个注释节点。

3. element 元素对象

在 HTML DOM 中, 元素对象代表着一个 HTML 元素
元素对象的子节点可以是元素节点,文本节点,注释节点

元素对象常用属性或方法说明
element.appendChild()为元素添加一个新的子元素
element.attributes返回一个元素的属性数组
element.childNodes返回元素的一个子节点的数组
element.children返回元素的子元素的集合
element.classList返回元素的类名,作为 DOMTokenList 对象。
element.className设置或返回元素的 class 属性名称
element.firstElementChild返回元素的第一个子元素
element.firstChild返回元素的第一个子节点
element.getAttribute()返回指定元素的属性值
element.getElementsByTagName()返回指定标签名的所有子元素集合。
element. getElementsByClassName()返回文档中所有指定类名的元素集合,作为 NodeList 对象。
element.hasAttribute()如果元素中存在指定的属性返回 true,否则返回false。
element.hasAttributes()如果元素有任何属性返回true,否则返回false。
element.hasChildNodes()返回一个元素是否具有任何子元素
element.id设置或者返回元素的 id。
element.innerHTML设置或者返回元素的内容。
element.innerText设置或者返回元素的内容。
element.nodeType返回元素的节点类型
element.nodeValue返回元素的节点值
element.removeAttribute()从元素中删除指定的属性
element.removeChild()删除一个子元素
element.style设置或返回元素的样式属性
element.setAttribute()设置或者改变指定属性并指定值。
element.setAttributeNode()设置或者改变指定属性节点。
element.value设置或获得值

在这里插入图片描述

4. 查找标签

直接查找标签
使用的方法
		document.getElementById           根据ID获取一个标签
		document.getElementsByClassName   根据class属性获取
		document.getElementsByTagName     根据标签名获取标签合集,需要索引取值
		
间接查找标签
使用的方法
		parentElement            父节点标签元素
		children                 所有子标签
		firstElementChild        第一个子标签元素
		lastElementChild         最后一个子标签元素
		nextElementSibling       下一个兄弟标签元素
		previousElementSibling   上一个兄弟标签元素
		
示例
		document.getElementById('d1').children 

查找id为d1的标签内部的所有子标签。

在这里插入图片描述

5. 节点操作

创建节点

如需向 HTML DOM 添加新元素,您首先必须创建该元素(元素节点),然后把它追加到已有的元素上。

使用的方法
		document.createElement()	创建元素节点。
		document.createTextNode()   创建文本节点。
		document.createAttribute()	创建一个属性节点
		document.createComment() 	创建一个注释节点。
		
示例(代码片段)

		<body>
		<div id="d1"></div>
		<script>
			var d1Ele = document.getElementById('d1')  //创建已有的元素变量
		    var pEle = document.createElement('p')  // 创建新段落节点
		    var aEle = document.createElement('a')  // 创建新链接节点
		    var cEle = document.createComment('这是新注释节点') // 创建新注释节点
		    var tEle = document.createTextNode('这是新文本节点')  //创建新文本节点
		    pEle.innerHTML = '<h2>这是新段落节点</h2>'  // 修改新段落节点内容
		    aEle.href = 'https://www.baidu.com'  // 修改链接地址
		    aEle.innerText = '点击转向百度'  // 修改链接文本
		    d1Ele.append(pEle)  // 在已存在节点后追加新段落节点
		    d1Ele.append(aEle)  // 在已存在节点后追加新链接节点
		    d1Ele.append(cEle)  // 在已存在节点后追加新注释节点
		    d1Ele.append(tEle)  // 在已存在节点后追加新文本节点
		</script>
		</body>


1. 执行后的结构如下图所示。

在这里插入图片描述

删除节点
使用的方法
		element.removeChild()	  删除一个子元素
		
示例(代码片段)

		<body>
		<div id="d1" ></div>
		<script>
		    var d1Ele = document.getElementById('d1')  //创建已有的元素变量
		    var pEle = document.createElement('p')  // 创建新段落节点
		    var aEle = document.createElement('a')  // 创建新链接节点
		    pEle.innerHTML = '这是新段落节点'  // 修改新段落节点内容
		    aEle.href = 'https://www.baidu.com'  // 修改
		    aEle.innerText = '点击转向百度'
		    d1Ele.append(pEle)  // 在已存在节点后追加新段落节点
		    d1Ele.append(aEle)  // 在已存在节点后追加新链接节点
		    d1Ele.removeChild(pEle)  // 删除节点
		
		</script>
		</body>


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. 属性操作

attribute操作
使用的方法

		element.getAttribute()	返回指定元素的属性值
		element.hasAttribute()	如果元素中存在指定的属性返回 true,否则返回false。
		element.setAttribute()	设置或者改变指定属性并指定值。
		element.removeAttribute()	从元素中删除指定的属性
		
获取指定属性值
使用的方法
		element.getAttribute()	返回指定元素的属性
		element.id				设置或者返回元素的 id 属性。
		element.className	    设置或返回元素的 class 属性
		element.href			设置或返回元素的 href 属性名称
		element.target			设置或返回元素的 target属性名称
			.							.
			.							.
			.							.
			
'getAttribute 语法':  element.getAttribute(attributename)

参数是指定的属性名
示例(代码片段)

		<body>
		<a id="a1" class="c1" href="https://www.baidu.com" target="_blank">点击跳转百度</a>
		<script>
		    var aEle = document.getElementById('a1')  
		    console.log(aEle.id)
		    console.log(aEle.className)
		    console.log(aEle.href)
		    console.log(aEle.target)
		    console.log(aEle.getAttribute('id'))
		    console.log(aEle.getAttribute('className'))
		    console.log(aEle.getAttribute('href'))
		    console.log(aEle.getAttribute('target'))
		</script>
		</body>


1. 使用 getAttribute 和直接点的方式结果一样,结果如下图

在这里插入图片描述

或者直接获取所有属性返回一个数组,使用的方法是  'element.attributes'。
由于是数组,所以需要索引取值。
修改指定属性
使用的方法

		element.setAttribute()	设置或者改变指定属性并指定值。
		element.id				设置或者返回元素的 id 属性。
		element.className	    设置或返回元素的 class 属性
		element.href			设置或返回元素的 href 属性名称
		element.target			设置或返回元素的 target属性名称
			.							.
			.							.
			.							.
			
'setAttribute 语法':

		element.setAttribute(attributename,attributevalue)

第一个参数是属性名,第二个参数是属性值。
示例(代码片段)
		<body>
		<a id="a1" class="c1" href="https://www.baidu.com" target="_blank">点击跳转百度</a>
		<script>
		    var aEle = document.getElementById('a1') 
		    aEle.id = 'a2'
		    aEle.className = 'c2'
		    aEle.href = 'https://www.sogou.com'
		    aEle.target = '_self'
		    aEle.setAttribute('id', 'a3')
		    aEle.setAttribute('class', 'c3')
		    aEle.setAttribute('href', 'https://blog.csdn.net/m0_58987515?spm=1011.2415.3001.5343')
		    aEle.setAttribute('target', '_blank')
		</script>
		</body>


1. 用点的方式和setAttribute方式都可以修改,按照最后执行的代码为准,结果如下图所示

在这里插入图片描述

'注意点':
		用点的方式只能修改和添加默认的属性,比如  idclass 等等,若是自定义属性需要使用方法
	setAttribute,如下示例
	
'添加修改自定义属性值'

		<body>
		<input id="i1" type="text">
		<script>
		    var iEle = document.getElementById('i1')  
		    // iEle.username = 'user'  不会显示
		    iEle.setAttribute('username', 'user')
		</script>
		</body>


1.添加自定义属性结果如下图

在这里插入图片描述

删除指定属性
使用的方法
		element.removeAttribute()	从元素中删除指定的属性

参数是指定的属性
示例(代码示例)

		<body>
		<input id="i1" type="text">
		<script>
		    var iEle = document.getElementById('i1')  
		    iEle.setAttribute('username', 'user')
		    iEle.removeAttribute('username')
		</script>
		</body>

Class 类操作

在前面介绍的都是对指定的类操作,这里还有一种针对 class 属性的操作方法。
使用的是element.classList 方法

使用的方法

		element.classList  # 查看所有的类属性
		element.classList.add()  # 添加类属性
		element.classList.remove()  # 移除类属性
		element.classList.contains()  # 判断是否含有某个类属性
		element.classList.toggle()  # 有则移除 无则添加


示例(代码片段)

		<body>
		<div class="c1"></div>
		<script>
		    var dEle = document.getElementsByTagName('div')[0]  //需要索引取值
		    console.log(dEle.classList)  // 查看所有class类
		    console.log(dEle.classList.add('c2','c3')) // 添加俩个类
		    console.log(dEle.classList.remove('c3')) // 删除c3类
		    console.log(dEle.classList.contains('c3')) //判断c3类是否存在,此时为false
		    console.log(dEle.classList.toggle('c3')) //由于c3不存在,则添加c3类
		</script>
		</body>


因此最终div的class类如下图所示。

在这里插入图片描述

在这里插入图片描述

7. 文本操作

使用的方法
		element.innerHTML	设置或者返回元素的内容。
		element.innerText	设置或者返回元素的内容。
		
获得、修改文本

innerText 方法也可以修改元素文本,但是不能识别标签内容。

示例(代码片段)

		<body>
		<p id="p1">修改前文本</p>
		<script>
		    var pEle = document.getElementById('p1') 
		    pEle.innerHTML = '<b>innerHTML 修改后文本</b>'
		    pEle.innerText = '<b>innerText 修改后文本</b>'
		</script>
		</body>


1. 由于 innerText 不能识别标签,所以标签也会被输出,结果如下图所示

在这里插入图片描述
在这里插入图片描述

8. 获取值

获取用户输入

支持用户输入的标签我们可以通过 value 属性来获得其内容。value操作适用于 input、select、textarea 等标签

使用的方法:     element.value
示例(代码片段)

		<body>
		<div><input type="text"></div>
		<div>
		    <select>
		        <option value="hz">杭州</option>
		        <option value="bj">北京</option>
		        <option value="sz">深圳</option>
		    </select>
		</div>
		<div><textarea></textarea></div>
		<script>
		    var iEle = document.getElementsByTagName('input')[0] // 需要索引取值
		    var sEle = document.getElementsByTagName('select')[0] // 需要索引取值
		    var tEle = document.getElementsByTagName('textarea')[0] // 需要索引取值
		</script>
		</body>


演示如下图

在这里插入图片描述

获取文件

有时候也需要用户上传文件,我们也可以通过 file 属性获取

使用的方法:    element.files 
示例(代码片段)

		<body>
		<div><input type="file" multiple></div> // 可上传多个文件
		<script>
		    var iEle = document.getElementsByTagName('input')[0] // 需要索引取值
		</script>
		</body>

演示如下图

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

9. 样式修改

使用DOM也可以直接修改元素的样式,使用的方法是element.style用于设置或返回元素的样式属性

示例(代码片段)

		<body>
		<p>你好啊</p>
		<script>
		    var pEle = document.getElementsByTagName('p')[0]
		    pEle.style.color = 'green'
		</script>
		</body>


1. 修改文本样式,改变文本颜色。

10. 事件对象

鼠标事件
属性说明
onclick当鼠标点击某个对象时触发
oncontextmenu鼠标右键打开上下文菜单时触发
ondblclick当鼠标双击某个对象时触发
onmousedown鼠标按钮被按下时触发。
onmouseenter当鼠标指针移动到元素上时触发。
onmouseleave当鼠标指针移出元素时触发
onmousemove鼠标被移动时触发。
onmouseover鼠标移到某元素之上时触发。
onmouseout鼠标从某元素移开时触发。
onmouseup鼠标按键被松开时触发。
键盘事件
属性说明
onkeydown某个键盘按键被按下时触发。
onkeypress某个键盘按键被按下并松开时触发。
onkeyup某个键盘按键被松开时触发。
表单事件
属性说明
onblur元素失去焦点时触发
onchange该事件在表单元素的内容改变时触发( <input>, <keygen>, <select>, 和 <textarea>)
onfocus元素获取焦点时触发
onfocusin元素即将获取焦点时触发
onfocusout元素即将失去焦点时触发
oninput元素获取用户输入时触发
onreset表单重置时触发
onsearch用户向搜索域输入文本时触发 ( <input=“search”>)
onselect用户选取文本时触发 ( <input> 和 <textarea>)
onsubmit表单提交时触发
绑定事件

首先肯定要创建一个函数,用于达到某个条件时执行

绑定方式一

		<body>
		<div>
		    <p onclick="f1()">点击时弹出警示框</p>  <!-- onclick 绑定事件 -->
		</div>
		<script>
		    function f1(){         // 达到条件时执行的事件函数
		        alert('哈哈哈')
		    }
		</script>
		</body>


补充:事件函数中有一个固定的关键字 this指代当前被操作对象本身
绑定方式二

		<body>
		<div>
		    <p>点击时弹出警示框</p>
		</div>
		<script>
		    var pEle = document.getElementsByTagName('p')[0]
		    pEle.onclick = function f1(){   // 绑定事件
		        alert('哈哈哈')
		    }
		</script>
		</body>


在这里插入图片描述

事件案例
简易校验
示例一(代码片段)

		<body>
		<div>username:
		    <input type="text" id="username">
		    <span style="color: red" id="username_error"></span>
		</div>
		<div>password:
		    <input type="text" id="password">
		    <span style="color: red" id="password_error"></span>
		</div>
		<input type="button" value="提交" id="btn">
		<script>
		    // 1.查找按钮标签
		    let btnEle = document.getElementById('btn');
		    // 2.绑定点击事件
		    btnEle.onclick = function () {
		        // 3.获取用户名和密码
		        let userNameVal = document.getElementById('username').value;
		        let passWordVal = document.getElementById('password').value;
		        // 4.判断
		        if (userNameVal === 'X') {
		            // 给用户名下面的span标签设置文本内容
		            let userSpanEle = document.getElementById('username_error')
		            userSpanEle.innerText = '用户名不能是X'
		        }
		        if (passWordVal === '123') {
		            // 给密码下面的span标签设置文本内容
		            let userSpanEle = document.getElementById('password_error')
		            userSpanEle.innerText = '密码不能是123'
		        }
		    }
		</script>
		</body>


在这里插入图片描述

搜索框
示例(代码片段)

		<body>
		<input type="text" id="d1" placeholder="默认搜索的内容">
		<script>
		    // 1.查找input标签对象
		    var inputEle = document.getElementById('d1')
		    // 2.绑定一个聚焦事件
		    inputEle.onfocus = function () {
		        // 3.清空value值
		        this.placeholder = ''
		    }
		    // 4.绑定一个失焦事件
		    inputEle.onblur = function () {
		        // 5.添加一个全新的value值
		        this.placeholder = '默认搜索的内容'
		    }
		</script>
		</body>


1. 搜索框有默认值,当鼠标聚焦在搜索框时,默认值被删除。当失去鼠标焦点时将默认值重新加在搜索框上
省市联动

此示例就是选择省份的时候会自动将该省份的城市添加进下拉列表。(以后使用组件代替)

示例(代码片段)

		<body>
		<p>省市:
		    <select name="" id="pro"></select>
		</p>
		<p>市区:
		    <select name="" id="city"></select>
		</p>
		<script>
		    let proEle = document.getElementById('pro');
		    let cityEle = document.getElementById('city');
		    // 1.自定义数据(以后有现成的组件实现)
		    let data = {
		        '':[],
		        "河北": ["廊坊", "邯郸"],
		        "北京": ["朝阳区", "海淀区"],
		        "山东": ["威海市", "烟台市"],
		        "安徽": ["合肥市", "芜湖市"],
		        "上海": ["静安", "黄埔"],
		        "深圳": ["龙湖", "罗湖"]
		    };
		    // 2.获取自定义对象中所有的key并添加到省市下拉框中
		    for (let proVal in data) {
		        // 2.1.创建option标签
		        opEle = document.createElement('option');
		        opEle.innerText = proVal;
		        opEle.value = proVal
		        // 2.2.添加到第一个下拉框中
		        proEle.append(opEle)
		    }
		    // 3.文本域变化事件
		    proEle.onchange = function () {
		        // 3.0.先清空市区下拉框中的内容
		        cityEle.innerHTML = '';
		        let currentPro = this.value;
		        let currentCityList = data[currentPro];
		        // 3.1.循环获取市区数据
		        for (let i = 0; i < currentCityList.length; i++) {
		            // 3.2.创建option标签
		            opEle = document.createElement('option');
		            opEle.innerText = currentCityList[i];
		            opEle.value = currentCityList[i]
		            // 2.2.添加到第一个下拉框中
		            cityEle.append(opEle)
		        }
		    }
		</script>
		</body>



在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值