欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

原生js底层基础(十七)DOM

程序员文章站 2022-06-30 19:17:52
...

DOM

1.基于节点树的遍历

parentNode 父节点,最顶端的是#document,每个节点只有一个父节点
parentNode 父节点,最顶端的是#document,每个节点只有一个父节点
childNodes 子节点,每个父节点可以有多个节点
firstChild 第一个子节点
lastChild 最后一个子节点
nextSibling 下一个兄弟结点
previousSibling 前一个兄弟节点

2.基于元素节点树的遍历(IE9以下不兼容,除了children)

parentElement 当前节点的父元素
children 当前元素的元素子节点
firstElementChild 第一个元素子节点
lastElementChild 最后一个元素子节点
nextElementSibling 下一个元素兄弟子节点
previousElementSibling

3.节点类型 nodeType

  • 元素节点 —1 记住
  • 属性节点 —2
  • 文本节点 —3 记住
  • 注释节点 —8
  • 文档节点 —9
  • DocumentFrame —11

4.节点的4个属性

  • nodeName 只读
  • nodeValue 可读可写
  • nodeType 类型(重要)
  • attributes

5.操作节点

(1)创建

  • document.createElement —创建元素节点 (常用)
  • documnet.createTextNode —创建文本节点
var div = document.createElement('div');
var text = document.createTextNode('hehe');
div.appendChild(text)
document.body.appendChild(div);

(2)插入

  • 父节点.appendChild —增加子节点至子元素尾,相当于数组的push(常用)

  • 被插入节点的父节点.isnertBefore (a,b) —将a元素插入到b前面, ( 常用 )

var div = document.createElement('div');
var p = document.createElement('p');
div.appendChild(p)
document.body.appendChild(div);
var em = document.createElement('em')
div.insertBefore(em,p);

(3)删除

  • parentNode.removeChild(“a”); —删除子节点a,相当于剪切,会返回删除的元素
  • node.remove() —把自己删了,不返回值
var div = document.createElement('div');
var p = document.createElement('p');
div.appendChild(p)
document.body.appendChild(div);
div.removeChild(p)	//删除子元素,返回删除元素
div.remove()	//删除自己,不返回

(4)替换

  • parent.replaceChild(new,origin); (不常用)
  • innerText (老版本火狐不兼容,火狐有特定的方法textContent,但是对老版本IE不好使)
  • innerHTML
  • setAttribute
  • getAttribute
var div = document.createElement('div');
div.innerHTML='<p><span></span></p>';
document.body.appendChild(div);
var p = document.getElementsByTagName('p')[0];
var span = document.getElementsByTagName('span')[0];
p.setAttribute('class','p')
span.innerText = 'hello!!';

HTML结构

<div>
	<p class="p">
		<span></span>
	</p>
</div>

扩展面试题:

1.封装函数insetAfter();功能类似insertBefore();
提示:可以忽略老版本浏览器,直接在Element.prototype上编程

2.将目标节点内部的节点顺序逆序
例如:

<div><a></a><em></em></div>
<div><em></em><a></a></div>

答案:
1.

var div2 = document.getElementsByClassName("d2")[0];
	var span = document.getElementsByTagName("span")[0];
	var strong = document.getElementsByTagName("strong")[0];
	var b = document.getElementsByTagName("b")[0];
	
	
Element.prototype.insertAfter = function(node, afterNode){
	var beforenode = afterNode.nextElementSibling;
	if(beforenode){//如果不是最后一个节点
		this.insertBefore(node,beforenode);
 	}else{         //如果是最后一个节点
  		this.appendChild(node);
 	}
}

注:原型链封装的好处,可以使用this指代调用的节点,不需要把调用节点当参数传入
2.

<!-- 实现目标节点内部的节点逆序) -->
	var div = document.getElementsByTagName("div")[0];
	Element.prototype.reverse = function(){
		var len = this.children.length;
		var lastNode = this.lastElementChild;
		var secondNode =lastNode.previousElementSibling;
		var pre = null;
			
		for(var i = 0;i < len;i++){
				
			pre = secondNode.previousElementSibling; 
				
			console.log("pre:"+secondNode.innerText);
			this.appendChild(secondNode);
			
			if(pre){
				secondNode = pre;
				console.log("post"+secondNode.innerText);
			}else{
				console.log(1111111111111);
			}
				
		}
			
	}
相关标签: js dom操作