本篇文章主要总结一下jQuery中DOM节点的建立、插入、删除与替换以及jQuery中丰富的遍历节点的方法。javascript
JavaScript原生接口建立节点,在处理上是很是复杂与繁琐的,jQuery简化了这个过程。css
建立元素节点:html
常见的就是直接把这个节点的结构给经过HTML标记字符串描述出来,经过$()函数处理,$("html结构")前端
$("<div></div>")复制代码
建立带文本节点:java
与建立元素节点相似,直接把文本内容一并描述jquery
$("<div>我是文本节点</div>")复制代码
建立带属性节点:web
与建立元素节点一样的方式数组
$("<div id='test' class='aaron'>我是文本节点</div>")复制代码
咱们经过jQuery把上一届的代码改造一下,如右边代码所示bash
一条一句就搞定了,跟写HTML结构方式是同样的app
$("<div class='right'><div class='aaron'>动态建立DIV元素节点</div></div>")复制代码
这就是jQuery建立节点的方式,让咱们保留HTML的结构书写方式,很是的简单、方便和灵活
建立的元素后,将看成页面某一个元素的子元素放到其内部。针对这样的处理,jQuery定义了2个操做的方法
append:这个操做与对指定的元素执行原生的appendChild方法,将它们添加到文档中的状况相似。
appendTo:实际上,使用这个方法是颠倒了常规的$(A).append(B)的操做,即不是把B追加到A中,而是把A追加到B中。
简单的总结就是:
在元素内部进行操做的方法,除了在被选元素的结尾(仍然在内部)经过append与appendTo插入指定内容外,相应的还能够在被选元素以前插入,jQuery提供的方法是prepend与prependTo
选择器的描述:
prepend与prependTo的使用及区别:
这里总结下内部操做四个方法的区别:
节点与节点以前有各类关系,除了父子,祖辈关系,还能够是兄弟关系。Query引入了2个方法,能够用来在匹配I的元素先后插入内容。
选择器描述:
注意点:
与内部插入处理同样,jQuery因为内容目标的位置不一样,然增长了2个新的方法insertAfter与insertBefore
注意事项:
要移除页面上节点是开发者常见的操做,jQuery提供了几种不一样的方法用来处理这个问题,这里咱们开仔细了解下empty方法
empty 顾名思义,清空方法,可是与删除又有点不同,由于它只移除了 指定元素中的全部子节点。
这个方法不只移除子元素(和其余后代元素),一样移除元素里的文本。由于,根听说明,元素里任何文本字符串都被看作是该元素的子节点。请看下面的HTML:
<div class="hello"><p>测试用文本</p></div>复制代码
若是咱们经过empty方法移除里面div的全部元素,它只是清空内部的html代码,可是标记仍然留在DOM中
//经过empty处理
$('.hello').empty()
//结果:<p>测试用文本</p>被移除,但匹配的元素还留在文档中
<div class="hello"></div>复制代码
remove与empty同样,都是移除元素的方法,可是remove会将元素自身移除,同时也会移除元素内部的一切,包括绑定的事件及与该元素相关的jQuery数据。
该方法不会把匹配的元素从 jQuery 对象中删除,于是能够在未来再使用这些匹配的元素。
例如一段节点,绑定点击事件
<div class="hello"><p>测试文本</p></div>
$('.hello').on("click",fn)复制代码
若是不经过remove方法删除这个节点其实也很简单,可是同时须要把事件给销毁掉,这里是为了防止"内存泄漏",前端开发必定要注意,绑了多少事件,不用的时候必定要记得销毁
经过remove方法移除div及其内部全部元素,remove内部会自动操做事件销毁方法,因此使用使用起来很是简单
//经过remove处理
$('.hello').remove()
//结果:<div class="hello"><p>慕课网</p></div> 所有被移除
//节点不存在了,同事事件也会被销毁复制代码
remove表达式参数:
remove比empty好用的地方就是能够传递一个选择器表达式用来过滤将被移除的匹配元素集合,能够选择性的删除指定的节点
$("p").remove(":contains('3')")复制代码
要用到移除指定元素的时候,jQuery提供了empty()与remove([expr])二个方法,两个都是删除元素,可是二者仍是有区别
empty方法
remove方法
若是咱们但愿临时删除页面上的节点,可是又不但愿节点上的数据与事件丢失,而且能在下一个时间段让这个删除的节点显示到页面,这时候就可使用detach方法来处理
detach从字面上就很容易理解。让一个web元素托管。即从当前页面中移除该元素,但保留这个元素的内存模型对象。
来看看jquery官方文档的解释:
这个方法不会把匹配的元素从jQuery对象中删除,于是能够在未来再使用这些匹配的元素。并且与remove()不一样的是,全部绑定的事件、附加的数据等都会保留下来。 $("div").detach()这一句会移除对象,仅仅是显示效果没有了。可是内存中仍是存在的。当你append以后,又从新回到了文档流中。就又显示出来了。
固然这里要特别注意,detach方法是JQuery特有的,因此它只能处理经过JQuery的方法绑定的事件或者数据。
<body>
<p>P元素1,默认给绑定一个点击事件</p>
<p>P元素2,默认给绑定一个点击事件</p>
<button id="bt1">点击删除 p 元素</button>
<button id="bt2">点击移动 p 元素</button>
<script type="text/javascript">
$('p').click(function(e) {
alert(e.target.innerHTML)
})
var p;
$("#bt1").click(function() {
if (!$("p").length) return; //去重,否则连续点两次删除,第二次删除会保存undefined在p里·
//经过detach方法删除元素
//只是页面不可见,可是这个节点仍是保存在内存中
//数据与事件都不会丢失
p = $("p").detach()
});
$("#bt2").click(function() {
//把p元素在添加到页面中
//事件仍是存在
$("body").append(p);
});
</script>
</body>复制代码
JQuery是一个很大强的工具库,在工做开发中,有些方法由于不经常使用到,或是没有注意到而被咱们忽略。
remove()和detach()可能就是其中的一个,可能remove()咱们用得比较多,而detach()就可能会不多了
经过一张对比表来解释2个方法之间的不一样
方法名 |
参数 |
事件及数据是否也被移除 |
元素自身是否被移除 |
remove |
支持选择器表达 |
是 |
是(无参数时),有参数时要根据参数所涉及的范围 |
detach |
参数同remove |
否 |
状况同remove |
remove:移除节点
detach:移除节点
克隆节点是DOM的常见操做,jQuery提供一个clone方法,专门用于处理dom的克隆
.clone()方法深度 复制全部匹配的元素集合,包括全部匹配元素、匹配元素的下级元素、文字节点。复制代码
clone方法比较简单就是克隆节点,可是须要注意,若是节点有事件或者数据之类的其余处理,咱们须要经过clone(ture)传递一个布尔值ture用来指定,这样不只仅只是克隆单纯的节点结构,还要把附带的事件与数据给一并克隆了
例如:
HTML部分
<div></div>
JavaScript部分
$("div").on('click', function() {//执行操做})
//clone处理一
$("div").clone() //只克隆告终构,事件丢失
//clone处理二
$("div").clone(true) //结构、事件与数据都克隆复制代码
使用上就是这样简单,使用克隆的咱们须要额外知道的细节:
.replaceWith( newContent ):用提供的内容替换集合中全部匹配的元素而且返回被删除元素的集合
简单来讲:用$()选择节点A,调用replaceWith方法,传入一个新的内容B(HTML字符串,DOM元素,或者jQuery对象)用来替换选中的节点A
看个简单的例子:一段HTML代码
<div>
<p>第一段</p>
<p>第二段</p>
<p>第三段</p>
</div>复制代码
替换第二段的节点与内容
$("p:eq(1)").replaceWith('<a style="color:red">替换第二段的内容</a>')复制代码
经过jQuery筛选出第二个p元素,调用replaceWith进行替换,结果以下
<div>
<p>第一段</p>
<a style="color:red">替换第二段的内容</a>' <p>第三段</p> </div>复制代码
.replaceAll( target ) :用集合的匹配元素替换每一个目标元素
.replaceAll()和.replaceWith()功能相似,可是目标和源相反,用上述的HTML结构,咱们用replaceAll处理
$('<a style="color:red">替换第二段的内容</a>').replaceAll('p:eq(1)')复制代码
总结:
若是要将元素用其余元素包裹起来,也就是给它增长一个父元素,针对这样的处理,JQuery提供了一个wrap方法
.wrap( wrappingElement ):在集合中匹配的每一个元素周围包裹一个HTML结构
简单的看一段代码:
<p>p元素</p>复制代码
给p元素增长一个div包裹
$('p').wrap('<div></div>')复制代码
最后的结构,p元素增长了一个父div的结构
<div>
<p>p元素</p>
</div>复制代码
.wrap( function ) :一个回调函数,返回用于包裹匹配元素的 HTML 内容或 jQuery 对象
使用后的效果与直接传递参数是同样,只不过能够把代码写在函数体内部,写法不一样而已
以第一个案例为例:
$('p').wrap(function() {
return '<div></div>'; //与第一种相似,只是写法不同
})复制代码
注意:
.wrap()函数能够接受任何字符串或对象,能够传递给$()工厂函数来指定一个DOM结构。这种结构能够嵌套了好几层深,但应该只包含一个核心的元素。每一个匹配的元素都会被这种结构包裹。该方法返回原始的元素集,以便以后使用链式方法。
咱们能够经过wrap方法给选中元素增长一个包裹的父元素。相反,若是删除选中元素的父元素要如何处理 ?
wrap是针对单个dom元素处理,若是要将集合中的元素用其余元素包裹起来,也就是给他们增长一个父元素,针对这样的处理,JQuery提供了一个wrapAll方法
.wrapAll( wrappingElement ):给集合中匹配的元素增长一个外面包裹HTML结构
简单的看一段代码:
<div id="demo1">
<p>元素1</p>
</div>
<div id="demo2">
<p>元素2</p>
<p>元素3</p>
</div>复制代码
给全部p元素增长一个div包裹
$('p').wrapAll('<div></div>')复制代码
最后的结构,3个匹配的P元素会被拉取成为第一个匹配的p元素的相邻兄弟元素,并增长了一个父div的结构
<div id="demo1">
<div>
<p>元素1</p>
<p>元素2</p>
<p>元素3</p>
</div>
</div>
<div id="demo2">
</div>复制代码
.wrapAll( function ) :一个回调函数,返回用于包裹匹配元素的 HTML 内容或 jQuery 对象
经过回调的方式能够单独处理每个元素
以上面案例为例,
$('p').wrapAll(function() {
return '<div><div/>';
})复制代码
以上的写法的结果以下,等同于warp的处理了
<div>
<p>p元素</p>
</div>
<div>
<p>p元素</p>
</div>复制代码
若是要将合集中的元素内部全部的子元素用其余元素包裹起来,并看成指定元素的子元素,针对这样的处理,JQuery提供了一个wrapInner方法
.wrapInner( wrappingElement ):给集合中匹配的元素的内部,增长包裹的HTML结构
听起来有点绕,能够用个简单的例子描述下,简单的看一段代码:
<div>p元素</div>
<div>p元素</div>复制代码
给全部元素增长一个p包裹
$('div').wrapInner('<p></p>')复制代码
最后的结构,匹配的di元素的内部元素被p给包裹了
<div>
<p>p元素</p>
</div>
<div>
<p>p元素</p>
</div>复制代码
.wrapInner( function ) :容许咱们用一个callback函数作参数,每次遇到匹配元素时,该函数被执行,返回一个DOM元素,jQuery对象,或者HTML片断,用来包住匹配元素的内容
以上面案例为例,
$('div').wrapInner(function() {
return '<p></p>';
})复制代码
以上的写法的结果以下,等同于第一种处理了
<div>
<p>p元素</p>
</div>
<div>
<p>p元素</p>
</div>复制代码
注意:
当经过一个选择器字符串传递给.wrapInner() 函数,其参数应该是格式正确的 HTML,而且 HTML 标签应该是被正确关闭的。
jQuery提供了一个unwrap()方法 ,做用与wrap方法是相反的。将匹配元素集合的父级元素删除,保留自身(和兄弟元素,若是存在)在原来的位置。
看一段简单案例:
<div>
<p>p元素</p>
</div>复制代码
我要删除这段代码中的div,通常常规的方法会直接经过remove或者empty方法
$('div').remove();复制代码
可是若是我还要保留内部元素p,这样就意味着须要多作不少处理,步骤相对要麻烦不少,为了更便捷,jQuery提供了unwrap方法很方便的处理了这个问题
$('p').unwrap();复制代码
找到p元素,而后调用unwrap方法,这样只会删除父辈div元素了
结果:
<p>p元素</p>复制代码
jQuery是一个合集对象,若是想快速查找合集里面的第一级子元素,此时能够用children()方法。这里须要注意:.children(selector) 方法是返回匹配元素集合中每一个元素的全部子元素(仅儿子辈,这里能够理解为就是父亲-儿子的关系)。
节点查找关系:
<div class="div">
<ul class="son">
<li class="grandson">1</li>
</ul>
</div>
复制代码
代码若是是$("div").children(),那么意味着只能找到ul,由于div与ul是父子关系,li与div是祖辈关系,所以没法找到。
children()不带参数时
容许咱们经过在DOM树中对匹配的元素的直接子元素进行搜索,而且构造一个新的匹配元素的jQuery对象
注意:jQuery是一个合集对象,因此经过children是匹配合集中每个元素的第一级子元素
.children()方法选择性地接受同一类型选择器表达式
$("div").children(".selected")复制代码
一样的也是由于jQuery是合集对象,可能须要对这个合集对象进行必定的筛选,找出目标元素,因此容许传一个选择器的表达式
jQuery是一个合集对象,若是想快速查找DOM树中的这些元素的后代元素,此时能够用find()方法,这也是开发使用频率很高的方法。这里要注意 children与find方法的区别,children是父子关系查找,find是后代全部子元素。
节点查找关系:
<div class="div">
<ul class="son">
<li class="grandson">1</li>
</ul>
</div>
复制代码
代码若是是$("div").find("li"),此时,li与div是祖辈关系,经过find方法就能够快速的查找到了。
注意:
jQuery是一个合集对象,若是想快速查找合集里面的每个元素的父元素(这里能够理解为就是父亲-儿子的关系),此时能够用parent()方法
由于是父元素,这个方法只会向上查找一级
理解节点查找关系:
<div class="div">
<ul class="son">
<li class="grandson">1</li>
</ul>
</div>
复制代码
查找ul的父元素div, $(ul).parent(),就是这样简单的表达
parent()无参数
parent()方法容许咱们可以在DOM树中搜索到这些元素的父级元素,从有序的向上匹配元素,并根据匹配的元素建立一个新的 jQuery 对象
注意:jQuery是一个合集对象,因此经过parent是匹配合集中每个元素的父元素
parent()带选择器表达式
一样的也是由于jQuery是合集对象,可能须要对这个合集对象进行必定的筛选,找出目标元素,因此容许传一个选择器的表达式
jQuery是一个合集对象,若是想快速查找合集里面的每个元素的全部祖辈元素,此时能够用parents()方法
其实也相似find与children的区别,parent只会查找一级,parents则会往上一直查到查找到祖先节点
理解节点查找关系:
<div class="div">
<ul class="son">
<li class="grandson">1</li>
</ul>
</div>
复制代码
在li节点上找到祖 辈元素div, 这里能够用$("li").parents()方法
parents()无参数
parents()方法容许咱们可以在DOM树中搜索到这些元素的祖先元素,从有序的向上匹配元素,并根据匹配的元素建立一个新的 jQuery 对象;
返回的元素秩序是从离他们最近的父级元素开始的
注意:jQuery是一个合集对象,因此经过parent是匹配合集中全部元素的祖辈元素
parents()方法选择性地接受同一型选择器表达式
一样的也是由于jQuery是合集对象,可能须要对这个合集对象进行必定的筛选,找出目标元素,因此容许传一个选择器的表达式
注意事项:
查找当前元素的父辈祖辈元素,jQuery还提供了closest()方法,这个方法相似parents可是又有一些细微的区别,属于使用频率很高的方法
closest()方法接受一个匹配元素的选择器字符串
从元素自己开始,在DOM 树上逐级向上级元素匹配,并返回最早匹配的祖先元素
例如:在div元素中,往上查找全部的li元素,能够这样表达
$("div").closet("li')复制代码
注意:jQuery是一个合集对象,因此经过closest是匹配合集中每个元素的祖先元素
closest()方法给定的jQuery集合或元素来过滤元素
一样的也是由于jQuery是合集对象,可能须要对这个合集对象进行必定的筛选,找出目标元素,因此容许传一个jQuery的对象
注意事项:在使用的时候须要特别注意下
.parents()和.closest()是有点类似的,都是往上遍历祖辈元素,可是二者仍是有区别的,不然就没有存在的意义了
.parent()带选择器参数和.closest()区别是
jQuery是一个合集对象,若是想快速查找指定元素集合中每个元素紧邻的后面同辈元素的元素集合,此时能够用next()方法
理解节点查找关系:
以下class="item-1"元素就是红色部分,那蓝色的class="item-2"就是它的兄弟元素
<ul class="level-3">
<li class="item-1">1</li>
<li class="item-2">2</li>
<li class="item-3">3</li>
</ul>复制代码
next()无参数
容许咱们找遍元素集合中紧跟着这些元素的直接兄弟元素,并根据匹配的元素建立一个新的 jQuery 对象。
注意:jQuery是一个合集对象,因此经过next匹配合集中每个元素的下一个兄弟元素
next()方法选择性地接受同一类型选择器表达式
一样的也是由于jQuery是合集对象,可能须要对这个合集对象进行必定的筛选,找出目标元素,因此容许传一个选择器的表达式
jQuery是一个合集对象,若是想快速查找指定元素集合中每个元素紧邻的前面同辈元素的元素集合,此时能够用prev()方法
理解节点查找关系:
以下蓝色的class="item-2"的li元素,红色的节点就是它的prev兄弟节点
<ul class="level-3">
<li class="item-1">1</li>
<li class="item-2">2</li>
<li class="item-3">3</li>
</ul>复制代码
prev()无参数
取得一个包含匹配的元素集合中每个元素紧邻的前一个同辈元素的元素集合
注意:jQuery是一个合集对象,因此经过prev是匹配合集中每个元素的上一个兄弟元素
prev()方法选择性地接受同一类型选择器表达式
一样的也是由于jQuery是合集对象,可能须要对这个合集对象进行必定的筛选,找出目标元素,因此容许传一个选择器的表达式
jQuery是一个合集对象,若是想快速查找指定元素集合中每个元素的同辈元素,此时能够用siblings()方法
理解节点查找关系:
以下蓝色的class="item-2"的li元素,红色的节点就是它的siblings兄弟节点
<ul class="level-3">
<li class="item-1">1</li>
<li class="item-2">2</li>
<li class="item-3">3</li>
</ul>复制代码
siblings()无参数
取得一个包含匹配的元素集合中每个元素的同辈元素的元素集合
注意:jQuery是一个合集对象,因此经过siblings是匹配合集中每个元素的同辈元素
siblings()方法选择性地接受同一类型选择器表达式
一样的也是由于jQuery是合集对象,可能须要对这个合集对象进行必定的筛选,找出目标元素,因此容许传一个选择器的表达式
jQuery是一个合集对象,经过$()方法找到指定的元素合集后能够进行一系列的操做。$()以后就意味着这个合集对象已是肯定的,若是后期须要再往这个合集中添加一新的元素要如何处理?jQuery为此提供add方法,用来建立一个新的jQuery对象 ,元素添加到匹配的元素集合中
.add()的参数能够几乎接受任何的$(),包括一个jQuery选择器表达式,DOM元素,或HTML片断引用。复制代码
简单的看一个案例:
操做:选择全部的li元素,以后把p元素也加入到li的合集中
<ul>
<li>list item 1</li>
<li>list item 3</li>
</ul>
<p>新的p元素</p>复制代码
处理一:传递选择器
$('li').add('p')复制代码
处理二:传递dom元素
$('li').add(document.getElementsByTagName('p')[0])复制代码
还有一种方式,就是动态建立P标签加入到合集,而后插入到指定的位置,可是这样就改变元素的自己的排列了
$('li').add('<p>新的p元素</p>').appendTo(目标位置)复制代码
jQuery是一个合集对象,经过$()方法找到指定的元素合集后能够进行一系列的操做。好比咱们操做$("li").css('') 给全部的li设置style值,由于jQuery是一个合集对象,因此css方法内部就必须封装一个遍历的方法,被称为隐式迭代的过程。要一个一个给合集中每个li设置颜色,这里方法就是each
.each() 方法就是一个for循环的迭代器,它会迭代jQuery对象合集中的每个DOM元素。每次回调函数执行时,会传递当前循环次数做为参数(从0开始计数
因此大致上了解3个重点:
each是一个for循环的包装迭代器
each经过回调的方式处理,而且会有2个固定的实参,索引与元素
each回调方法中的this指向当前迭代的dom元素复制代码
看一个简单的案例
<ul>
<li>test</li>
<li>test</li>
</ul>复制代码
开始迭代li,循环2次
$("li").each(function(index, element) {
index 索引 0,1
element是对应的li节点 li,li
this 指向的是li
})复制代码
这样能够在循环体会作一些逻辑操做了,若是须要提早退出,能够以经过返回 false以便在回调函数内停止循