JavaScript 关于节点(记录学习)

目录

1.JavaScript中什么是节点?

1.1元素节点(element node):

1.2文本节点(text node):

1.3属性节点(attribute node):

2.节点对象的属性

3.获取节点对象元素方法

下面举例

3.1:getElementById(id)//根据ID获取元素

3.2:getElementsByTagName(tag)//按标记名(标签名)获取元素

 3.3:getElementsByName(name)//按名称获取元素

3.4:getAttribute(attributeName)//根据标签属性获取元素

3.5:setAttribute(attribute,value)//根据属性获取元素来修改或是添加该属性的值

 3.6:removeAttribute(name)//移除属性

4.节点处理方法

4.1:生成节点

4.2:插入和添加节点 

4.3:复制节点

4.4:删除和替换节点


1.JavaScript中什么是节点?

在DOM中,每个容器,独立的元素或文本块都被看作为一个节点,节点是W3C DOM的基本构建块。当一个容器包含另一个容器时,对应节点之间有父子关系(父节点,子节点)。同时该节点数遵循HTML的结构化本质,如<html>元素包含<head>、<boyd>,前者又包含<title>,后者包含各种块元素等。DOM中定义了HTML文档中6中相关节点类型。所有支持W3C DOM的浏览器(IE5+,Mozl和Safari等)都实现了前三种常见的类型,其中Mozl实现了所有类型。

节点类型表
节点类型数值节点类型附加说明实例
1元素(Element)HTML标记(标签)元素<h1>……</h1>
2属性(Attribute)HTML标记元素的属性<h1 color="red">……</h1>
3文本(Text)被HTML标记括起来的文本<h1>Hello HTML</h1>
8注释(Comment)HTML注释<!--Comment-->
9文档(Document)HTML文档根文本对象<html>
10文档类型(Document Type)文档类型<!DOCTYPE HTML PUBLIC"……">

1.1元素节点(element node):

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h1></h1>
		<ul>
			<li>JavaScript</li>
			<li>JavaScript</li>
			<li>JavaScript</li>
			<li>JavaScript</li>
		</ul>
		<!--
        在节点树中,每个元素对象构成一个节点。元素可以包含其他元素。
        所有的列表项元素<li>都包含在无序列表元素<ul>内部。
		其中节点树中<html>元素是节点树的根节点-->
	</body>
</html>

1.2文本节点(text node):

元素节点构成树的枝条,而文本节点构成树的叶子。

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<p>你好<em>朋友</em>们!</p>
		<!--
		包含"你好","朋友","们"三个文本节点。
		文本节点总是包含在元素节点的内部。
		但并非所有的元素节点都包含或直接包含文本节点,
		如元素节点例:
		ul元素节点不包含任何文本节点,
		而是包含另外的元素节点。
		后者包含文本节点。
		所以说,有些元素节点只是间接性包含了文本节点。
		-->
	</body>
</html>

1.3属性节点(attribute node):

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h1 id="h1"></h1>
		<h2 class="cl1"></h2>
		<h3 align="center"></h3>
		<!--
		id和class也是属于属性
		注意:并非所有的元素都包含属性,但所有的属性都包含在元素里。
		-->
	</body>
</html>

2.节点对象的属性

节点属性表
节点属性附加说明
nodeName返回当前节点姓名
nodeValue返回当前节点的值(仅对文本节点)
nodeType返回当前节点的类型数值
parenNode引用当前节点的父节点(存在的话)
childNodes访问当前节点的子节点集合(存在的话)
firstChild对标记的子节点集合中第一个节点引用
lastChild对标记的子节点集合中最后一个节点引用
previousSibling对同属一个父节点的前一个兄弟节点引用
nextSibling对同属一个父节点的下一个兄弟节点引用
attributes返回当前节点(标记)属性的列表
ownerDocument指向包含节点(标记)的HTML document对象

案例:

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<input type="text" id="ip">你好</input>
		<input type="button" value="查看节点姓名/值/类型值" id="btn1">
		<script>
			function $(id) {
				return document.getElementById(id);
			}
			//获取节点
			$("btn1").onclick = function() { //匿名函数绑定到btn的点击事件中
				let ip = $("ip");
				alert("节点名:" + ip.nodeName +
					"\n" + "节点值:" + ip.nodeValue + //只对文本节点生效,返回空
					"\n" + "父节点:" + ip.parentNode + //无父节点的情况下,默认为body。
					//返回(HTMLBody文档对象)
					"\n" + "子节点:" + ip.childNodes + //返回一个子节点列表。childNodes[下标]精确指定
					"\n" + "第一个节点:" + ip.firstChild + //不存在返回null
					"\n" + "最后一个节点:" + ip.lastChild + //不存在返回null
					"\n" + "前一个兄弟节点:" + ip.previousSibling +
					//为什么input前一个节点都已经是body了
					//还返回 text对象?
					//换行在文档中也算是文本。
					"\n" + "节点下一个兄弟节点:" + ip.nextSibling + //和上面同理
					"\n" + "返回当前节点:" + ip.attributes + //返回当前节点的属性列表
					"\n" + "节点对象:" + ip.ownerDocument //文档Object
				);
			}
		</script>
	</body>
</html>

3.获取节点对象元素方法

对象方法是脚本给该对象的命令,可以有返回值,也可没有,且不是每个对象都有办法定义。DOM中定义了操作节点的一些列有效方法。(说人话就是开发JavaScript的大佬已经封装好,直接调用就行了。)
说明:getElementss返回的皆为伪数组(其实就是数组,因为都要遍历)

下面举例

3.1:getElementById(id)//根据ID获取元素

通过id属性值的定位元素对象(id不能重复)
基本语法:getElementById(id);

	<body>
		<p id="gm">早上好!我的朋友们!</p>
		<script>
			function show() {
				let a = document.getElementById("gm"); //DOM中的方法要带document.
				a.style.color = "red"; //可以设置样式
				a.innerText = "晚上好";
                document.write(typeof a);//返回为Object(对象)
			}
			show(); //调用方法
            /*
            封装方法方便调用(传个ID就行了)
            function $(id){
				return document.getElementById(id);
			}
            */ 
		</script>
	</body>

typeof运算符用于获取类型信息。返回值有六种:
number(数值),string(字符),boolean(布尔),object(对象)
function(函数),undefined(空或是未定义)

3.2:getElementsByTagName(tag)//按标记名(标签名)获取元素

该方法返回文档(HTML)里指定的标签tag的元素数组。
简单语法:getElementByTagName("标签名");//封装不需要带"",传参需要;

<body>
		<p ">早上好!我的朋友们!</p>
		<p ">中上好!我的朋友们!</p>
		<p ">晚上好!我的朋友们!</p>
		<p ">昨天好!我的朋友们!</p>
		<p ">明天好!我的朋友们!</p>
		<p ">后天好!我的朋友们!</p>
		<p ">好的!我的朋友们!</p>
		<script>
			function show() {
				let a = document.getElementsByTagName("p"); //DOM中的方法要带document.
                //遍历数组a
				for (let i = 0; i < a.length; i++) {
					a[i].style.color = "red";
					document.write(typeof a+"<br>");
					//br换行
				}
			}
			show(); //调用方法
		</script>
	</body>

 3.3:getElementsByName(name)//按名称获取元素

简单语法:getElementsByName("标签name属性的值");
相对id属性,<form>、<select>等元素节点更适合name属性,这时就需要getElementsByName()方法定位。

HTML元素 

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/1.js"></script>
	</head>
	<body>
		<form action="">
			<input type="checkbox" name="Love" value="吃">吃
			<input type="checkbox" name="Love" value="喝">喝
			<input type="checkbox" name="Love" value="玩">玩
			<input type="checkbox" name="Love" value="乐">乐
			<br>
			<input type="button" value="全选" id="btn1">
			<input type="button" value="取消全选" id="btn2">
			<input type="button" value="反选" id="btn3">
		</form>
	</body>
</html>

外部JavaScript

function $(id){
	return document.getElementById(id);
}
function $Nname(name){
	return document.getElementsByName(name);
}
window.onload=function(){//写在窗体加载事件中
	function btn1(){//匿名函数
		let Love=$Nname("Love");//获取name为"Love"单选框按钮
        //遍历返回的数组
		for (let i = 0; i < Love.length; i++) {
			Love[i].checked=true;//设置为选中
		}
	}
	function btn2(){
		let Love=$Nname("Love");
		for (let i = 0; i < Love.length; i++) {
			Love[i].checked=false;//设置为不选中
		}
	}
	$("btn1").onclick=btn1;//绑定给全选
	$("btn2").onclick=btn2;//绑定取消全选
    //这边再写一个反选函数。直接id定位元素绑定点击事件再匿名函数
	$("btn3").onclick=function(){
		let Love=$Nname("Love");
		for (let i = 0; i < Love.length; i++) {
			if(Love[i].checked==false){//判断如果为false就为true
				Love[i].checked=true;
			}
			else{//否则为false
				Love[i].checked=false;
			}
		}
	}
}

3.4:getAttribute(attributeName)//根据标签属性获取元素

该方法返回目标对象指定属性名称的某个属性值。
简单语法:getAttribute("属性名");

	<body>
		<div id="d1" title="你好!">
			来自五湖四海的朋友们!
		</div>
		<script>
			let a=document.getElementById("d1");
			document.write(a.getAttribute("title"));
		</script>
	</body>

效果: 
 

 说明:为什么"你好"在下面?
因为HTML是遵循从上到下的原则来加载代码的。script代码块在元素块下面,所以"你好"会出现在元素块下面。

3.5:setAttribute(attribute,value)//根据属性获取元素来修改或是添加该属性的值

简单语法:setAttribute("属性名","需要修改或是添加的属性值");
get读取,那set就是写入咯。方法字面意思"写入属性值"也可以修改。但是属性不存在的话,无法对属性进行值的写入或是修改

	<body>
		<div id="d1" title="你好!">
			来自五湖四海的朋友们!
		</div>
		<script>
			//通过ID定位到元素
			let a=document.getElementById("d1");
			//通过setAttribute方法修改值
            //注意:属性存在才能对其进行修改或是添加操作
			a.setAttribute("title","您们好!");
			//输出d1元素的title属性值
			document.write(a.getAttribute("title"));
		</script>
	</body>

效果: 

 3.6:removeAttribute(name)//移除属性

简单语法:removeAttribute("属性名");
删除任意元素节点指定的属性。

	<body>
		<div id="d1" align="center">
			来自五湖四海的朋友们!
		</div>
		<script>
			//通过ID定位到元素
			let a=document.getElementById("d1");
			a.removeAttribute("align");
			//可以发现d1中的文本已经不再居中。
			//align属性已被删除
		</script>
	</body>

效果: 

4.节点处理方法

由于文本节点具有易于操作、对象明确等特点, DOM Level 1提供了非常丰富的节点处理方法。
 

节点处理方法表
操作类型方法原型附加说明
生成节点createElement(tagName)创建由tagName指定类型的标记
createTextNode(srting)创建包含字符串string的文本节点
createAttribute(name)创建属性
createComment(string)创建由字符串string指定的文本注释
插入和添加节点appendChild(newChild)添加子节点newChild到目标节点
insertBefore(newChild,targetChild)将新节点newChild
复制节点cloneNode(bool)复制节点本身,由逻辑bool确定是否复制子节点
删除和替换节点removeChild(childName)删除由childName指定
replaceChild(newChild,oldChild)用新节点newChild替换旧节点oldChild

接下来对以上方法进行逐一举例: 

4.1:生成节点

4.1.1:createElement(tagName);//创建标签节点
简单语法:createElement("标签名");

	<body>
		<div id="d1" align="center">
			来自五湖四海的朋友们!
		</div>
		<script>
			//创建一个p标签
			let p=document.createElement("p");
			document.write(p.nodeName);//输出
			//发现已经创建了
		</script>
	</body>

效果图: 

 

4.1.2:createTextNode(string);//创建文本节点 
简单语法:create TextNode("需要创建的文本");

<body>
		<div id="d1" align="center">
			来自五湖四海的朋友们!
		</div>
		<script>
			//创建一个文本节点
			let p=document.createTextNode("这是关于节点处理方法!");
			//输出
			document.write("该节点的值:"+p.nodeValue+"<br>");
			document.write("该节点的姓名:"+p.nodeName);
		</script>
	</body>

效果: 

4.1.3:createAtturibute(name);//创建属性
简单语法:createAtturibute("属性名")

<body>
		<div id="d1">
			来自五湖四海的朋友们!
		</div>
		<script>
			function $(id) {
				return document.getElementById(id);
			}
            //变量保存创建属性方法
			let ag = document.createAttribute("align");
            //进行属性赋值    
			ag.value = "center";
            //添加进标签中
			$("d1").setAttributeNode(ag);
			//扩展一下
			/*
			setAttributeNode(意为写入属性节点)
			配合创建属性使用
			简单语法:
			setAttributeNode(属性变量或是直接把方法写在里面也可以);
			*/
		</script>
	</body>

效果图: 这里已经居中

4.1.4:createComment(string);//创建文本注释(不常用,大家就看看就行了) 
简单语法:createComment("文本");

<body>
		<div id="d1">
			来自五湖四海的朋友们!
		</div>
		<script>
			function $(id) {
				return document.getElementById(id);
			}
			let ag = document.createComment("aaaaaaaaa");
			console.log(ag); //控制台输出(F12);
		</script>
	</body>

4.2:插入和添加节点 

4.2.1:appendChild(newChild);//添加子节点到目标节点中
简单语法:目标节点.appendChild(子节点);

	<body>
		<div id="d1">
			来自五湖四海的朋友们!
		</div>
		<script>
			function $(id) {
				return document.getElementById(id);
			}
			//首先创建标签节点
			let ag = document.createElement("p");
			ag.innerText = "记得先创建标签节点";
			//添加节点
			$("d1").appendChild(ag);
		</script>
	</body>

效果图: 

 4.2.2:insertBefore(newChild,targetChild);//将新节点插入到目标targetChild之前。意思就是将新的插入的目标节点的前面。比如评论区:最新的评论会在最上面。
简单语法:父节点.insertBefore(新节点,目标节点)

<body>
		<div id="d1">
			<p id="p" style="color: aqua;">我是被替代一号位的子节点</p>
			来自五湖四海的朋友们!
		</div>
		<script>
			function $(id) {
				return document.getElementById(id);
			}
			//首先创建标签节点
			let ag = document.createElement("p");
			ag.innerText = "我是新的子节点";
			ag.style.color = "red"
			//添加节点
			//在目标节点的前面插入;
			//父节点.insertBefore(新节点,目标节点);
			$("d1").insertBefore(ag, $("p"));
		</script>
	</body>

效果: 

4.3:复制节点

  4.3.1:clone(bool);//复制节点本身,由bool值确定是否复制子节点(true是,false否)
简单语法:clone(true或是false)

<body>
		<div id="d1" style="background-color: red;width: 200px;height: 100px;margin-top: 20px;" >
			<p id="p" style="color: aqua;">我是子节点</p>
			来自五湖四海的朋友们!
		</div>
		<script>
			function $(id) {
				return document.getElementById(id);
			}
			let d1f=$("d1").cloneNode(false);//不复制子节点
			let d1t=$("d1").cloneNode(true);//复制子节点
			//文档body(直接定位到HTML中的body)
			document.body.appendChild(d1f);
			document.body.appendChild(d1t);
		</script> 
	</body>

效果: 可以看到原本的div已经到了下面,说明每次插入元素都是从上往下
 

4.4:删除和替换节点

  4.4.1:removeChild(childName);//删除由ChildName(子节点名称)指定的节点;
简单语法:父节点.ChildName(指定删除节点的名称);
说明:div的父节点是body。(表示为document.body);

<body>
		<div id="d1" style="background-color: red;width: 200px;height: 100px;margin-top: 20px;">
			<p id="p" style="color: aqua;">我是子节点</p>
			来自五湖四海的朋友们!
		</div>
		<script>
			function $(id) {
				return document.getElementById(id);
			}
			let a = $("d1"); //指定父节点
			//父节点.removeChild(需要移除的子节点);
			//a.removeChild($("p"));//通过id
			a.removeChild(document.getElementsByTagName("p")[0]); //通过标签姓名数组
			//还有其他获取元素的方法就不一样举例了
		</script>
</body>

4.4.2:replaceChild(newChild,oldChild);//删除由(子节点名称)指定的节点;
用新节点(newChild)替换旧节点(oldChild);
简单语法:父节点.replaceChild(新节点,旧节点);

<body>
		<div id="d1" style="background-color: red;width: 200px;height: 100px;margin-top: 20px;">
			<p id="p" style="color: aqua;">我是子节点</p>
			来自五湖四海的朋友们!
		</div>
		<script>
			function $(id) {
				return document.getElementById(id);
			}
			let a = $("d1"); //获取父节点节点
			let b = $("p"); //替换节点
			let c = document.createElement("p") //创建新的标签节点
			c.innerText = "我是替换节点";
			//父节点.replaceChild(新节点,替换的旧节点)
			a.replaceChild(c, b);
		</script>
	</body>

补充两个方法:

1:document.querySelector();
简单来说就是根据选择器获取整个页面匹配的元素;
直接上案例

<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<style>
		#d1 {
			background-color: red;
			width: 200px;
			height: 100px;
			margin-top: 20px;
		}

		#p {
			color: aqua;
		}

		#u1 {
			display: inline-block;
		}
	</style>
	<body>
		<div id="d1">
			<p id="p">
				我是p节点的文本
			<ul id="u1">
				<li>我是第1个li</li>
				<li>我是第2个li</li>
				<li>我是第3个li</li>
				<li>我是第4个li</li>
				<li>我是第5个li</li>
			</ul>
			</p>
			来自五湖四海的朋友们!
		</div>
		<script>
			//通过选择器方法定位到id为d1的元素
			let a = document.querySelector("#d1");

			a.style.display = "inline-block";

			//输出一下
			console.log(a.innerText);
		</script>
	</body>
</html>

 

document.querySelector("可以配合其他选择器使用,后代/类/子元素");

	</style>
	<body>
		<div id="d1">
			<p id="p">
				我是p节点的文本
			<ul id="u1">
				<li>我是第1个li</li>
				<li>我是第2个li</li>
				<li>我是第3个li</li>
				<li>我是第4个li</li>
				<li>我是第5个li</li>
			</ul>
			</p>
			来自五湖四海的朋友们!
		</div>
		<script>
			//通过选择器方法定位到id为d1>ul>li的元素
			let a = document.querySelector("#d1>ul>li");

			a.style.display = "inline-block";

			//输出一下
			console.log(a.innerText);
		</script>
	</body>
</html>

 这里大家应该发现了一个问题,明明有五个li元素怎么只返回了第一个li元素。这是因为document.querySelector();只返回一个匹配元素。如果要多个返回需要用到下面这个方法。

2:document.querySelectorAll();
根据选择器获取多个页面元素元素。返回一个节点集合(伪数组);
直接看案例:

<body>
		<div id="d1">
			<p id="p">
				我是p节点的文本
			<ul id="u1">
				<li>我是第1个li</li>
				<li>我是第2个li</li>
				<li>我是第3个li</li>
				<li>我是第4个li</li>
				<li>我是第5个li</li>
			</ul>
			</p>
			来自五湖四海的朋友们!
		</div>
		<script>
			//通过选择器方法定位到id为d1>ul>li的元素
			let a = document.querySelectorAll("#d1>ul>li");
			//输出一下//返回的数组需要遍历
			for (let i = 0; i < a.length; i++) {
				a[i].style.display = "inline-block";
				console.log(a[i].innerText);
			}
			
		</script>
	</body>

 

 

 到这就算是记录完毕了。感谢大家的阅读。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值