前端node相关操作汇总

Node 介绍

【DOM】

DOM是文档对象模型的简称。它的基本思想是:

把结构化文档解析成一系列的节点,再由这些节点组成一个树状结构(DOM Tree)。

所有的节点和最终的树状结构,都有规范的对外接口,以达到使用编程语言操作文档的目的(比如增删内容)。

所以,DOM可以理解成文档的编程接口。

【Node】

node是DOM的最小组成单位,一个文档的树形结构就是由各种不同类型的节点组成。

对于HTML文档,node主要有以下六种类型:

在这里插入图片描述

Document节点操作页面元素(原生js)

【ownerDocument】

ownerDocument属性返回当前节点所在的顶层文档对象,即document对象。

var d = p.ownerDocument;
d === document // true
console.log(d.nodeName);//#document

【nextSibling】

nextSibling属性返回紧跟在当前节点后面的第一个同级节点。
如果当前节点后面没有同级节点,则返回null。

var el = document.getElementById('div-01').firstChild;
var i = 1;
while (el) {
	console.log(i + '. ' + el.nodeName);
	el = el.nextSibling;
	i++;
}

【previousSibling】

previousSibling属性返回当前节点前面的第一个同级节点。
如果当前节点前面没有同级节点,则返回null。

<a>
	<b id="b1"><b/>
	<b id="b2"><b/>
</a>

document.getElementById("b1").previousSibling		 // null
document.getElementById("b2").previousSibling.id 	 // "b1"

【parentNode】

parentNode属性返回当前节点的父节点。
如果当前节点没有父节点,则返回null(document节点)。

if (node.parentNode) {
	node.parentNode.removeChild(node);
}

【parentElement】

parentElement属性返回当前节点的父元素节点。
如果当前节点没有父节点,或者父节点类型不是Element节点,则返回null。

if (node.parentElement) {
	node.parentElement.style.display = 'none';
}

【textContent】

textContent属性返回当前节点和它的所有后代节点的文本内容。

// HTML代码为
<div id="divA">This is <span>some</span> text</div>
// JS代码为
document.getElementById(“divA”).textContent// This is some text

【nodeValue】

nodeValue属性返回或设置当前节点的值,格式为字符串。
但是nodeValue只对Text节点、Comment节点、XML文档的CDATA节点有效,其他类型的节点一律返回null。

//HTML代码
<a href="#" name="a2-name" id="a2-id">hehehe</a>
<button id="btn">oooooooo</button>

var a2_node = document.getElementById(“a2-id”).firstChild;
console.log(a2_node.nodeValue);
document.getElementById(“btn”).onclick = function(){
	a2_node.nodeValue = ‘呵呵’;//点击按钮能够让a标签标题发生改变
};
因此,nodeValue属性一般只用于Text节点。对于那些返回null的节点,设置nodeValue属性是无效的。

【childNodes】

childNodes属性返回一个节点集合(NodeList),节点集合中包括当前节点的所有子节点。

需要指出的是,除了HTML中的元素节点之外,该属性返回的还包括Text节点和Comment节点。
如果当前节点不包括任何子节点,则返回一个空的NodeList集合。
由于NodeList对象是一个动态集合,一旦子节点发生变化,立刻会反映在返回结果之中。
var ulNodes = document.querySelector('ul').childNodes;

【firstChild】

firstChild属性返回当前节点的第一个子节点,如果当前节点没有子节点,则返回null。
需要指出的是,除了HTML元素子节点,该属性还包括文本节点和评论节点。

【lastChild】

lastChild属性返回当前节点的最后一个子节点,如果当前节点没有子节点,则返回null。

<ul id="ul" name="ul">
	<li id="li-1" name="li-1">111</li>
	<li id="li-2" name="li-2">222</li>
	<li id="li-3" name="li-3">333</li>
</ul>
var firstNode = document.querySelector('ul').firstChild;
console.log(firstNode.innerText);//111
var lastNode = document.querySelector('ul').lastChild;
console.log(lastNode.innerText);//333

【appendChild()】

appendChild()方法接受一个节点对象作为参数,将其作为最后一个子节点,插入当前节点

var p = document.createElement("p");
document.body.appendChild(p);

【hasChildNodes()】

hasChildNodes()方法返回一个布尔值,表示当前节点是否有子节点。

var foo = document.getElementById("foo");	
if ( foo.hasChildNodes() ) {
	foo.removeChild( foo.childNodes[0] );
}

【childNodes()】

cloneNode()方法用于克隆一个节点。它接受一个布尔值作为参数,表示是否同时克隆子节点。默认是false,即不克隆子节点。

<ul id="ul" name="ul">
<li id="li-1" name="li-1">111</li>
</ul>
var li_clone1 = document.querySelector('li').cloneNode(true);
console.log(li_1.innerText);//"111"
var li_clone2 = document.querySelector('li').cloneNode(false);
console.log(li_1.innerText);//""
需要注意的是,克隆一个节点,会拷贝该节点的所有属性,但是会丧失addEventListener方法和on-属性(即node.onclick = fn)添加在这个节点上的事件回调函数。

【insertBefore()】

insertBefore方法用于将某个节点插入当前节点的指定位置。

它接受两个参数,第一个参数是所要插入的节点,第二个参数是当前节点的一个子节点,新的节点将插在这个节点的前面。

该方法返回被插入的新节点,根据情况不是必须创建变量来保存。

var text1 = document.createTextNode('1');
var li = document.createElement('li');
li.appendChild(text1);

var ul = document.querySelector('ul');
ul.insertBefore(li,ul.firstChild);
上述代码的作用是,将带有文字节点的li插入到ul的第一个子节点之前。

【removeChild()】

removeChild方法接受一个子节点作为参数,用于从当前节点移除该节点。
它返回被移除的节点,根据情况不是必须创建变量来保存。

var divA = document.getElementById('A');
divA.parentNode.removeChild(divA);
上述代码是如何移除一个指定节点。

【replaceChild()】

replaceChild方法用于将一个新的节点,替换当前节点的某一个子节点。
它接受两个参数,第一个参数是用来替换的新节点,第二个参数将要被替换走的子节点。它返回被替换走的那个节点。

var	replacedNode = parentNode.replaceChild(newChild, oldChild);

举个例子:
	var divA = document.getElementById('A');
	var newSpan = document.createElement('span');
	newSpan.textContent = 'Hello World!';
	divA.parentNode.replaceChild(newSpan,divA);

【contains()】

contains方法接受一个节点作为参数,返回一个布尔值。

contains方法表示判断【参数节点】是否为【当前节点】的子节点。

//HTML代码
<p name="p2" id="p2-id"><span id="span-id">123</span></p>//检查p元素中是否包含span元素
var span = document.getElementById("span-id");
var p = document.getElementById("p2-id");
var bool = p.contains(span);
console.log(bool);//true
document.body.contains(node) 检查某个节点,是否包含在当前文档之中。
nodeA.contains(nodeA) // true  节点自身包含自身的结果是真的。

【isEqualNode()】

isEqualNode方法返回一个布尔值,用于检查两个节点是否相等。

//HTML代码
<ul id="u2-id"><li>123</li></ul>
<ul id="u3-id"><li>123</li></ul>
//JS代码
var u2 = document.getElementById(“u2-id”);//通过元素名获取页面中指定元素
var u2_id = document.getElementsByTagName("ul")[0];
var u3 = document.getElementById("u3-id");
console.log('u2和u3相等吗:'+u2.isEqualNode(u3));//false
console.log('u2和u2_id相等吗:'+u2.isEqualNode(u2_id));//true
所谓相等的节点,指的是两个节点的类型相同、属性相同、子节点相同。

【querySelector()】

querySelector()
方法返回匹配指定的CSS选择器的元素节点。如果有多个节点满足匹配条件则返回第一个匹配的节点。如果没有发现匹配的节点则返回null。

<style>.lianJie{color:red;}</style>

<a href="#" name="a1" class="lianJie">345</a>
<a href="#" name="a2" class="lianJie">123</a>
<script>
	var temp = document.querySelector(".lianJie");
	console.log(temp.innerText);
</script>//345
querySelector是匹配的选择器,那么如果是选择器为id时参数应该是"#id名"

【getElementById()】

getElementById()
返回匹配指定ID属性的元素节点

【getElementsByTagName()】

getElementsByTagName()
返回所有指定标签的元素

【getElementsByClassName()】

getElementsByClassName()
返回符合指定类名的所有元素

【getElementsByName()】

getElementsByName()
用于选择拥有name属性的HTML元素

必须保证在执行选中元素操作之前,元素已经被创建完毕

querySelector系列方法与getElementsBy系列方法对比

注意:querySelector系列方法与getElementsBy系列方法对比有什么不同?

(i)两者的W3C标准不同
querySelector系列属于W3C中的Selectors API规范
getElementsBy系列则属于 W3C的DOM 规范。(ii)两者浏览器的兼容不同 querySelector系列基本能被所有浏览器支持。 getElementsBy系列则通常只有在考虑兼容性的时候才被提起(尽管两者功能近似)

(iii)接受参数不同
querySelector系列接收的参数是一个css选择器名。
getElementsBy系列接收的参数只能是单一的className、tagName 和 name。
var c1 = document.querySelectorAll(‘.k1 .u’); var c2 = document.getElementsByClassName(‘p’); var c3 = document.getElementsByClassName(‘b2’)[0].getElementsByClassName(‘d’);

(iv)返回值不同
querySelectorAll()返回的是一个静态节点列表(Static NodeList)
getElementsBy系列的返回的是一个动态节点列表(Live NodeList)。

【createElement()】

createElement()
生成html元素节点

语法:document.createElement("标签名");
var newp = document.createElement(“p”);
document.body.appendChild(newp);

【createTextNode()】

createTextNode()
生成文本节点,参数为所要生成的文本节点的内容

var newp = document.createElement(“p”);
var p_text = document.createTextNode(“这是p的文本节点内容”);
newp.appendChild(p_text);
document.body.appendChild(newp);

【createAttribute()】

createAttribute()
生成一个新的属性对象节点,并返回它

var newp = document.createElement("p");
var p_text = document.createTextNode("here is p text Node");
newp.appendChild(p_text);
var p_style = document.createAttribute("style");
p_style.value = "color:cyan;";
newp.setAttributeNode(p_style);
document.body.appendChild(newp);

【getAttribute()、setAttribute()和removeAttribute() 】

元素节点特性方法

getAttribute('属性名');
setAttribute('属性名','属性值');
removeAttribute('属性名');

【setProperty()、getPropertyValue()和removeProperty()】

元素节点的style属性方法

setProperty(propertyName,value):设置某个CSS属性。
getPropertyValue(propertyName):读取某个CSS属性。
removeProperty(propertyName):删除某个CSS属性。

Document节点操作页面元素(Jquery)

【children()】

本属性选中某一个元素的所有直接儿子元素。

//$('selector').children()
$("#box").children().css("background-color","red");
//将#box中所有的子元素背景色都变红
注意:children()里面可以加参数,参数需要是选择器。
     表示既是这个元素的子元素,又满足参数选择器的元素。
	 $("#box").children(".teshu").css("background-color","red");

【find()】

由于children()只能查找子元素,如果是孙子元素是找不到的。

所以jQuery提供了find()"寻找"的方法。

//在某个节点中查找符合选择器要求的后代节点
$("div").click(function(){	
//$(this)没有引号,表示触发监听的这个元素,这个元素是某一个div	
	$(this).find("li").css("background-color","red");
});
//同样的find()里面也可以加选择器。

【parent()方法】

查找当前节点的直属父节点

$("p").click(function(){
	$(this).parent().css("background-color","red");
}); 
 //把点击的p标签的父级元素背景改成红色

【parents()方法】

查找当前节点的所有祖先节点,知道html节点为止。

$("p").click(function(){
	$(this).parent().css("background-color","red");
 });
//把点击的p标签的所有祖先节点背景改成红色

【siblings()】

访问当前节点的所有兄弟节点(除本身之外)

$("li").click(function(){
	//常见用法,排他操作。
	$(this).addClass('selected').siblings().removeClass("selected");
}); 

【next()、prev()、nextAll()和prevAll()】

next() 后一个亲兄弟
prev() 前一个亲兄弟
nextAll() 后所有亲兄弟
prevAll() 前所有亲兄弟

$(this).next().css("background-color","red");//其他格式一样,以此类推

【index()】

index()方法用来获取当前元素在其兄弟节点中的排名,从0开始。

$('selector').index()

【each()】

遍历每个节点,然后执行里面的回调函数。

回调函数中如果存在$(this),那么它指的是【遍历中当前这一次的这个节点】。

$('selector').each(func)

$("div").each(function(){	
	$(this).children().eq(2).css("background-color","red");
});

【append()、appendTo()、prepend()、prependTo()】

这四个方法都用来在某个节点内部插入新内容

	A.append(B);		//向【A节点内部现有内容之后】追加【B节点】
	B.appendTo(A);	//将【B节点】追加到【A节点内部现有内容之后】
	A.prepend(B);		//向【A节点内部现有内容之前】追加【B节点】
	B.prependTo(A);	//将【B节点】追加到【A节点内部的现有内容之前】

四个方法所表达的含义大致相同,只不过在语法上略有出入。其中AB均为节点。

 $('span').append($('<b>这是后添加的b标签</b>'));

【after()、before()、insertAfter()、insertBefore()】

相比于前面的四个方法的作用,这四个方法可以认为是给当前节点添加兄弟

	A.after(B);			//在【A节点之后】添加【同级节点B】
	A.before(B);		//在【A节点之前】添加【同级节点B】
	A.insertAfter(B);	//把【A节点】添加到【B节点之后】
	A.insertBefore(B);	//将【A节点】添加到【B节点之前】

四个方法所表达的含义大致相同,只不过在语法上略有出入。其中AB均为节点。

【删除节点empty()、remove()】

empty()表示删除指定节点中的内容,而remove()则表示移除自己

	A.empty() 等价于 A.html(‘’);
	A.remove();

【克隆节点clone()】

相当于js中的cloneNode操作,即克隆的节点在页面中没有自己的位置。

需要通过append等操作才能够追加到页面当中。

	A.append(B.clone) 

选择器

选择器:first   	选中指定元素集合中的第一个元素
选择器:last 		选中指定元素集合中的最后一个元素
选择器:eq(n) 	选中指定元素集合中从0开始,第n个元素
选择器:lt(n)		选中指定元素集合中从0开始,第n个元素之前的所有元素
选择器:gt(n)	选中指定元素集合中从0开始,第n个元素之后的所有元素
选择器:odd		选中指定元素集合中从0开始,所有奇数序号的元素
选择器:even	选中指定元素集合中从0开始,所有偶数序号的元素

事件名

jQuery中事件的名字,一律没有on。
单击: 				click()				
双击:  			dblclick()
鼠标进入:  		mouseenter() 		
鼠标离开:  		mouseleave() 
文本框得到焦点:  	focus()				
失去焦点:			blur()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GG_com

1分也是爱!!!!!!!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值