DOM的节点操作

13 篇文章 0 订阅
12 篇文章 0 订阅

回顾上一节内容:

1.如何获取页面上的元素(标签)

选择器优先:

1.1通过方法的形式去获取页面上的标签
 

document.getElementById();

document.getElementsByName();

document.getElementsByTagName();

document.getElementsByClassName('类名');

document.querySelector('选择器');

document.querySelectorAll('选择器'); 

2.完善全选框的例子:

 <input id="all" type="checkbox"> 全选
 <hr>
 <input name = "hobbys" type="checkbox" value = "1">
 <input name = "hobbys" type="checkbox" value = "2">
 <input name = "hobbys" type="checkbox" value = "3">
 <input name = "hobbys" type="checkbox" value = "4">
 <input name = "hobbys" type="checkbox" value = "5">
 <script type="text/javascript">

// 根据id属性获取元素
var all = document.getElementById('all');
//根据选择器获取元素(一组  伪数组)
// var inputs = document.querySelectorAll('input');

	// 为这个复选框设置一个点击事件 onclick
	all.onclick = function(){
		var inputs = document.getElementsByName('hobbys');
		// console.log(inputs)
		for(var i = 0;i<inputs.length;i++){
			inputs[i].checked = all.checked;
		}
	};
	var inputs = document.getElementsByName('hobbys');
	//完善全选
	for(var i = 0;i<inputs.length;i++){
		
		//设置点击
		inputs[i].onclick = function(){
			var flag = true;
			// console.log(this);
			//获取所有的子复选框
			var inputss = document.getElementsByName('hobbys');
			for(var i = 0;i<inputss.length;i++){
				if(inputss[i].checked === false){
					flag = false;
					break;
				}
			}
			all.checked = flag;
		};
	}

本节内容:

1.为什么学习节点操作? ------主要原因:获取元素

1.1获取元素通常使用两种方式

第一种方式:利用DOM提供的方法获取元素 document.getElementById(); document.getElementsByTagName(); document.getElementsByName(); document.querySelector(); ... 逻辑性不强、繁琐。

第二种方式:利用节点层级关系获取元素 利用父子兄节点关系获取元素 逻辑性强,但是兼容性稍差

【总结】这两种方式都可以获取元素节点,我们后面都会使用,但是节点操作更简单。

2.节点概述

网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点使用node来表示。

HTML DOM树中的所有节点均可通过JavaScript进行访问,所有HTML元素(节点)均可被修改,也可以创建或删除。

一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

var oBox = document.querySelector('.oBox'); console.dir(oBox);

元素节点 nodeType -> 1 属性节点 nodeType -> 2 文本节点 nodeType -> 3(文本节点包含文字、空格、换行等)

【总结】我们在实际开发中,节点操作主要操作的是"元素节点"。

3.节点层次

利用DOM树可以把节点划分为不同的层次关系,常见的是:父子兄层级关系。

3.1父级节点 (node.parentNode )

parentNode属性可返回某节点的父节点,注意是最近的一个父节点

如果指定的节点没有父节点则返回null

//根据first节点获取父节点
		// console.log(first.parentNode);
		// console.log(first.parentElement);

3.2 子节点操作 (标准与非标准)

① parentNode.childNodes (标准)

返回包含指定节点的子节点的集合,该集合为即时更新的集合。

【注意】返回值里面包含了所有的子节点,包含元素节点、文本节点等。 如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes。

//获取指定节点下的所有子节点(包含文本节点)

var ul = document.querySelector('ul');
for(var i = 0;i<ul.childNodes.length;i++){
	if(ul.childNodes[i].nodeType == 1){
		console.log(ul.childNodes[i]);
	}
}

②parentNode.children (非标准)

该属性是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回。

虽然children是一个非标准,但是得到了各个浏览器的支持,因此我们可以放心使用。

③根据指定的节点获取该节点下第一个子节点的标准方法:

parentNode.firstChild   ====   
非标准的方法   获取元素节点(不包含文本节点)
parentNode.firstElementChild (IE9以上支持)
 返回第一个子节点,找不到则返回null。同样,也是包含所有的节点。

④根据指定的节点获取该节点下最后一个子节点的标准方法:

parentNode.lastChild   ====   parentNode.lastElementChild (IE9以上支持)
        // innerHTML  获取非表单元素中的文本内容
        // value  获取表单元素中的文本内容
        // console.log(myDemo.lastElementChild.innerHTML);
    ** 返回最后一个子节点,找不到则返回null。同样,也是包含所有的节点。

【注意事项】实际开发中获取指定子元素的写法是通过children[下标]获取。能够解决兼容性问题。

(4)兄弟节点 node.nextSibling    ====    node.nextElementSibling     (IE9以上支持)
    ** 返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。

(5)兄弟节点node.previousSibling    ====    node.previousElementSibling     (IE9以上支持)
    ** 返回当前元素的上一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。

解决兼容性(少用)
function getNextElementSibling(element){
    var el = element;
    while(el = el.nextSibling){
        if(el.nodeType === 1){
            return el;
        }
        return null;
    }
}

4.节点操作之节点创建

document.createElement('tagName');

<ul class="oUl">
		<li>好好学习</li>
	</ul>
	<button id="oBtn">点击创建li添加到ul列表中</button>
	<button id="oBtn2">innerHTML</button>
	<button id="oBtn3">insertBefore</button>
	<script type="text/javascript">
		//获取按钮
		var oBtn = document.getElementById('oBtn');
		oBtn.onclick = function(){
			//创建元素节点   document.createElement();
			var newLi = document.createElement('li');
			console.log(newLi);
			//创建属性
			var myId = document.createAttribute('id');
			//在li标签上设置属性
			newLi.setAttributeNode(myId);
			//给创建的属性赋值
			newLi.id = 'sb';
			
			//创建一个文本节点
			var text = document.createTextNode('我用双手成就你的梦想');

5.节点操作之节点添加(前后的添加)

//将内容追加到新创建的li标签中

newLi.appendChild(text);
			//添加节点的方法(向指定的标签中添加标签)
			// appendChild 末尾追加
			//获取oUl
			var oUl = document.querySelector('.oUl');
			oUl.appendChild(newLi);
		};
var oBtn2 = document.getElementById('oBtn2');
		oBtn2.onclick = function(){
			var oUl = document.querySelector('.oUl');
			// 重新赋值
			oUl.innerHTML = "<li>'好好学习'<li>"
		};

//insertBefore  在指定的节点之前添加一个新的节点

node.insertBefore(child,指定元素)

// node.insertBefore(newNode,指定的节点)
		var oBtn3 = document.getElementById('oBtn3');
		oBtn3.onclick = function(){
			//需求:在ul之前追加一个p段落标签
			var oUl = document.querySelector('.oUl');
			var lis = oUl.firstElementChild;
			
			//创建一个p段落标签
			var newP = document.createElement('p');
			var textP = document.createTextNode('我是P段落');
			newP.appendChild(textP);
			
			console.log(oUl.insertBefore(newP,lis));
		};

6.删除节点

	node.removeChild(child)

7.复制节点 (也叫克隆clone)与替换节点

node.cloneNode(true|false);
replaceChild;


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h3>替换节点  克隆节点</h3>
		<ul id="oUl">
			<li>11111</li>
			<li>2222</li>
		</ul>
		<button onclick="myf();">点击替换</button>
		<button onclick="myb();">点击克隆</button>

<script type="text/javascript">
		function myf(){
			// replaceChild();
			//得到ul
			var oUl = document.getElementById('oUl');
			//获取内容为2222的li标签
			var li2 = oUl.lastElementChild;
			//创建p段落
			var newP = document.createElement('p');
			var textP = document.createTextNode('段落内容');
			newP.appendChild(textP);
			
			oUl.replaceChild(newP,li2);
		};
	
		// 克隆节点
		function myb(){
			var oUl = document.getElementById('oUl');
			//获取第一个子节点进行克隆
			var first = oUl.firstElementChild;
			//克隆节点
			// cloneNode()  如果没有参数就是浅拷贝(只复制结构,没有内容)
			// .cloneNode(true); 深拷贝
			var newFirst = first.cloneNode(true);
			// 将克隆的节点追加到末尾
			oUl.appendChild(newFirst);
		}
</script>
</body>

9.在li标签上设置、获得、移除元素的属性

setAttribute(); 设置元素的属性
			getAttribute();//获取元素的属性
			removeAttribute(); 移除元素的属性

10.创建文本节点

createTextNode

11.表格相关对象 :

  table表格对象
    属性:row[]  返回包含表格中所有行的一个数组
    方法:
	insertRow()从表格中插入一个新行
	deleteRow()从表格中删除一行

tableRow表格行对象
属性:
cells():返回包含行中所有单元格的一个数组
rowIndex:返回该行在表中的位置
方法:
insertCell():在一行中的指定位置插入一个空的<td>标签
deleteCell():删除行中指定的单元格

tableCell单元格行对象	cellIndex	返回单元格在某行单元格集合中的位置
innerHTML	设置或返回单元格的开始标签和结束标签之间的HTML
align	设置或返回单元格内部数据的水平排列方式
className	设置或返回元素的class属性


<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<!-- 表格的节点操作 -->
		<!-- 需求:当点击按钮时   生成一个tr标签 -->
		<table border="1" cellspacing="0" cellpadding="0" width="400">
			<tr>
				<td>编号</td>
				<td>姓名</td>
				<td>性别</td>
			</tr>
		</table>
		<hr>
		<button onclick="myf()">点击生成数据</button>
		<!-- js -->
		<script>
			function myf(){
				var table = document.querySelector('table');
				var tbody = table.querySelector('tbody');
				//创建tr
				var newTr = document.createElement('tr');
				//单元格
				for(var i = 0;i<3;i++){
					var cell = document.createElement('td');
					var str = window.prompt('请输入数据');
					var text = document.createTextNode(str);
					cell.appendChild(text);
					newTr.appendChild(cell);
				}
//追加到末尾 tr
			tbody.appendChild(newTr);
		}
	</script>

12.表格末尾新增--末尾新增tr

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<table border="1" cellpadding="0" cellspacing="0" width="500">
			<tr>
				<td>编号</td>
				<td>名称</td>
				<td>姓名</td>
				<td>操作</td>
			</tr>
		</table>
		<hr>
		<button onclick="myf();">末尾新增tr</button>
		<script type="text/javascript">
			function myf(){
				var table = document.querySelector('table');
				//获取表格的tr的长度
				var index = table.rows.length;
				//调用insertRow  传入一个参数   下标
				var newTr = table.insertRow(index);
				//id属性
				newTr.id = index;
// var first = table.rows[0];
			// alert(first.cells.length);
			// for(var i = 0;i<first.cells.length;i++){
				
			// }
			
			//单元格
			var c1 = newTr.insertCell(0);
			c1.innerHTML = '<input style = "width:60px;" value = "123">';
			var c2 = newTr.insertCell(1);
			c2.innerHTML = '<input style = "width:60px;" value = "456">';
			var c3 = newTr.insertCell(2);
			c3.innerHTML = '<input style = "width:60px;">'
			var c4 = newTr.insertCell(3);
			c4.innerHTML = "<button onclick = 'myconfirm("+newTr.id+")'>确定</button>"
		}
		
		function myconfirm(obj){
			// alert(obj)
			var tr = document.getElementById(obj);
				//1
				var cell1 = tr.cells[0].firstElementChild.value;
				// alert(cell1)
				//覆盖input输入项
				tr.cells[0].innerHTML = cell1;
				//2
				var cell2 = tr.cells[1].firstElementChild.value
				tr.cells[1].innerHTML = cell2;
				// 3
				var cell3 = tr.cells[2].firstElementChild.value
				tr.cells[2].innerHTML = cell3;
				 var btn = tr.cells[3].lastElementChild;
				//点击确定之后  确认按钮的内容  修改  事件
				btn.innerHTML = '修改';
				
				//修改事件
			
				btn.setAttribute("onclick","edit("+obj+")");
		}
	function edit(obj){
			// alert(obj)
			// alert(typeof(obj))
			// alert(obj.parentNode.parentNode.innerHTML);
			//根据id获取tr
			var tr = document.getElementById(obj);
			
			var c1 = tr.cells[0].innerHTML;
			alert(c1)
			tr.cells[0].innerHTML = "<input type = 'text' value = '"+c1+"'>"
			
			var btn = tr.cells[3].lastElementChild;
			btn.innerHTML = '确认';
			btn.setAttribute("onclick","myconfirm("+obj+")");
		}
	</script>
</body>
</html>

13.实现留言操作:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<h3>我的留言</h3>
		<hr>
		<textarea id="cc" rows="" cols="">
</textarea>
	<button id="obtn1">发表</button>
	<hr>
	<ul id="content">
	</ul>
	<script type="text/javascript">
		var obtn1 = document.getElementById('obtn1');
		obtn1.onclick = function() {
			//获取文本域的内容
			var cc = document.getElementById('cc');
			// console.log(cc.value);
			//获取oUl
			var oUl = document.getElementById('content');
			//创建一个li标签
			var newLi = document.createElement('li');
			var textLi = document.createTextNode(cc.value);
	newLi.appendChild(btn);
			//将li追加到ul
			oUl.appendChild(newLi);
		}
		//获取ul
		// var content = document.getElementById('content');
		// var btns = content.getElementsByTagName('button');
		// console.log(btns);
		
		function delLY(obj){
			// alert(obj.parentNode.innerHTML)
			// 删除节点   removeChild();
			//获取oUl
			var flag = confirm("你确定要删除吗?");
			if(flag == true){
				var oUl = document.getElementById('content');
				oUl.removeChild(obj.parentNode);
			}
		}
	</script>
</body>
			newLi.appendChild(textLi)
			var btn = document.createElement('button');
			var btncontent = document.createTextNode('删除');
			btn.appendChild(btncontent)
			
			//可以给每个按钮添加一个事件属性
			btn.setAttribute('onclick',"delLY(this)");

总结:

		/*
			节点的获取
				firstChild|firstElementChild
				lastChild|lastElementChild
				parentNode|parentElement
				childNodes|children
				
			节点的创建
				createElement();元素节点创建
				createTextNode();//文本节点创建
				createAttribute();属性节点创建
				
			添加节点
				appendChild
				insertBefore()
				
			替换节点
				replaceChild
				
			克隆节点 
				cloneNode
				
			删除节点
				removeChild
				
			setAttribute(); 设置元素的属性
			getAttribute();//获取元素的属性
			removeAttribute(); 移除元素的属性
		
		*/ 
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值