德胜云资讯,添加一些关于程序相关的内容,仅供大家学习交流(https://www.wxclwl.com)
日期:2023/03/26 02:13作者:张茂以人气:
一、为什么要学习这门课?
在日常工作中,我们接触的比较多的就是先定义好html的结构,再进行数据绑定等后续开发,但是如果在ajax请求获取数据之后才能确定html结构呢?这就需要我们动态的去处理节点,js已经提供了对应的方法去创建节点、新增属性、填充文本等,但是经常遇到每一个节点需要单独创建、节点的属性需要单独设置、浏览器兼容性等一系列问题,极大的增加了开发的复杂性,这个时候jquery提供了一套完美的接口来解决这些问题。
为了更直观的体现jquery的强大之处,我们下面分别通过js和jquery来实现动态创建节点等一系列操作的示例,让大家在实战中体会到二者之间的巨大差距。
1、js实现
2、jquery实现
从上面的例子不难看出,虽然是实现的同样的功能,但是jquery的代码更加精简,现在是不是已经迫不及待想要开始进入jquery的大门了呢,废话不多说,那我们就开始吧。
二、DOM节点的插入
1、append()和appendTo()
动态创建的元素会先放在内存中,如果想要呈现在页面上,那么就用到这俩个方法,append()和appengTo()的区别就在于append前面是被插得对象,后面是要插得对象,而appendTo正好相反。
2、after()和before()
after()是在匹配的每个元素之后插入参数指定内容,作为兄弟节点,如果后面已经有元素了,将后面的元素后移后插入
before()是在匹配的每个元素之前插入参数指定内容,作为兄弟节点,如果前面已经有元素了,将前面的元素前移后插入
3、prepend()和prependTo()
这俩个方法和append()、appendTo()类似,区别就是append是向每个匹配元素里面追加内容,而prepend是加前置内容
4、 insertAfter()和insertBefore()
(1).before()和.insertBefore()实现同样的功能。主要的区别是语法——内容和目标的位置。 对于before()选择表达式在函数前面,内容作为参数,而.insertBefore()刚好相反,内容在方法前面,它将被放在参数里元素的前面
(2).after()和.insertAfter() 实现同样的功能。主要的不同是语法——特别是(插入)内容和目标的位置。 对于after()选择表达式在函数的前面,参数是将要插入的内容。对于 .insertAfter(), 刚好相反,内容在方法前面,它将被放在参数里元素的后面
(3)before、after与insertBefore。insertAfter的除了目标与位置的不同外,后面的不支持多参数处理
三、DOM节点的删除
1、empty()
移除当前元素下的所有子节点和文本,当前元素不被移除
2、remove()
Remove和empty的区别在于remove移除当前元素,且会移除绑定的事件,移除事件可以防止内存泄漏的风险。
显然与empty相比,remove更好用,且remove可以带一个选择器表达式作为参数来过滤要被移除的元素集合
3、detach()
官方解释:这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素。与remove()不同的是,所有绑定的事件、附加的数据等都会保留下来。
$("div").detach()这一句会移除对象,仅仅是显示效果没有了。但是内存中还是存在的。当你append之后,又重新回到了文档流中。就又显示出来了。
四、DOM节点的复制与替换
1、clone()
·clone()方法时,在将它插入到文档之前,我们可以修改克隆后的元素或者元素内容,如$(this).clone().css(color,red)
·通过传递true,将所有绑定在原始元素上的事件处理函数复制到克隆元素上
·clone()方法是jQuery扩展的,只能处理通过jQuery绑定的事件与数据
·元素数据(data)内对象和数组不会被复制,将继续被克隆元素和原始元素共享。深复制的所有数据,需要手动复制每一个
2、replaceWith()和replaceAl()
· .replaceAll()和.replaceWith()功能类似,主要是目标和源的位置区别
· .replaceWith()与.replaceAll() 方法会删除与节点相关联的所有数据和事件处理程序
· .replaceWith()方法,和大部分其他jQuery方法一样,返回jQuery对象,所以可以和其他方法链接使用
· .replaceWith()方法返回的jQuery对象引用的是替换前的节点,而不是通过replaceWith/replaceAll方法替换后的节点
3、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>; //与第一种类似,只是写法不一样
})
4、unwrap()
Unwrap的作用与wrap完全相反
看一段简单案例:
<div>
<p>p元素</p>
</div>
找到p元素,然后调用unwrap方法,这样只会删除父辈div元素了
$(p).unwrap();
结果:
<p>p元素</p>
5、 wrapall()
wrap是针对单个dom元素处理,如果要将集合中的元素用其他元素包裹起来,也就是给他们增加一个父元素,针对这样的处理,JQuery提供了一个wrapAll方法
.wrapAll( wrappingElement ):给集合中匹配的元素增加一个外面包裹HTML结构
简单的看一段代码:
<p>p元素</p>
<p>p元素</p>
给所有p元素增加一个div包裹
$(p).wrapAll(<div></div>)
最后的结构,2个P元素都增加了一个父div的结构
<div>
<p>p元素</p>
<p>p元素</p>
</div>
.wrapAll( function ) :一个回调函数,返回用于包裹匹配元素的 HTML 内容或 jQuery 对象
通过回调的方式可以单独处理每一个元素
以上面案例为例,
$(p).wrapAll(function() {
return <div><div/>;
})
以上的写法的结果如下,等同于warp的处理了
<div>
<p>p元素</p>
</div>
<div>
<p>p元素</p>
</div>
6、 wrapInner()
如果要将合集中的元素内部所有的子元素用其他元素包裹起来,并当作指定元素的子元素,针对这样的处理,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>
五、jquery遍历
1、children()
jQuery是一个合集对象,如果想快速查找合集里面的第一级子元素,此时可以用children()方法。这里需要注意:.children(selector) 方法是返回匹配元素集合中每个元素的所有子元素(仅儿子辈,这里可以理解为就是父亲-儿子的关系)
理解节点查找关系:
<div class="div">
代码如果是$("div").children(),那么意味着只能找到ul,因为div与ul是父子关系,li与div是祖辈关系,因此无法找到。
children()无参数
允许我们通过在DOM树中对这些元素的直接子元素进行搜索,并且构造一个新的匹配元素的jQuery对象
注意:jQuery是一个合集对象,所以通过children是匹配合集中每一给元素的第一级子元素
.children()方法选择性地接受同一类型选择器表达式
$("div").children(".selected")
同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
2、find()
jQuery是一个合集对象,如果想快速查找DOM树中的这些元素的后代元素,此时可以用find()方法,这也是开发使用频率很高的方法。这里要注意 children与find方法的区别,children是父子关系查找,find是后代关系(包含父子关系)
理解节点查找关系:
<div class="div">
代码如果是$("div").find("li"),此时,li与div是祖辈关系,通过find方法就可以快速的查找到了。
.find()方法要注意的知识点:
find是遍历当前元素集合中每个元素的后代。只要符合,不管是儿子辈,孙子辈都可以。
与其他的树遍历方法不同,选择器表达式对于 .find() 是必需的参数。如果我们需要实现对所有后代元素的取回,可以传递通配选择器 *。
find只在后代中遍历,不包括自己。
选择器 context 是由 .find() 方法实现的;因此,$(.item-ii).find(li) 等价于 $(li, .item-ii)(找到类名为item-ii的标签下的li标签)。
注意重点:
.find()和.children()方法是相似的
3、parent()
jQuery是一个合集对象,如果想快速查找合集里面的每一个元素的父元素(这里可以理解为就是父亲-儿子的关系),此时可以用parent()方法
因为是父元素,这个方法只会向上查找一级
理解节点查找关系:
<div class="div">
查找ul的父元素div, $(ul).parent(),就是这样简单的表达
parent()无参数
parent()方法允许我们能够在DOM树中搜索到这些元素的父级元素,从有序的向上匹配元素,并根据匹配的元素创建一个新的 jQuery 对象
注意:jQuery是一个合集对象,所以通过parent是匹配合集中每一个元素的父元素
parent()方法选择性地接受同一型选择器表达式
同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
4、parents()
jQuery是一个合集对象,如果想快速查找合集里面的每一个元素的所有祖辈元素,此时可以用parents()方法
其实也类似find与children的区别,parent只会查找一级,parents则会往上一直查到查找到祖先节点
理解节点查找关系:
<div class="div">
在li节点上找到祖 辈元素div, 这里可以用$("li").parents()方法
parents()无参数
parents()方法允许我们能够在DOM树中搜索到这些元素的祖先元素,从有序的向上匹配元素,并根据匹配的元素创建一个新的 jQuery 对象;
返回的元素秩序是从离他们最近的父级元素开始的
注意:jQuery是一个合集对象,所以通过parent是匹配合集中所有元素的祖辈元素
parents()方法选择性地接受同一型选择器表达式
同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
注意事项:
.parents()和.parent()方法是相似的,但后者只是进行了一个单级的DOM树查找
5、closest()
以选定的元素为中心,往内查找可以通过find、children方法。如果往上查找,也就是查找当前元素的父辈祖辈元素,jQuery提供了closest()方法,这个方法类似parents但是又有一些细微的区别,属于使用频率很高的方法
closest()方法接受一个匹配元素的选择器字符串
从元素本身开始,在DOM 树上逐级向上级元素匹配,并返回最先匹配的祖先元素
例如:在div元素中,往上查找所有的li元素,可以这样表达
$("div").closet("li)
注意:jQuery是一个合集对象,所以通过closest是匹配合集中每一个元素的祖先元素
closest()方法给定的jQuery集合或元素来过滤元素
同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个jQuery的对象
注意事项:在使用的时候需要特别注意下
粗看.parents()和.closest()是有点相似的,都是往上遍历祖辈元素,但是两者还是有区别的,否则就没有存在的意义了
起始位置不同:.closest开始于当前元素 .parents开始于父元素
遍历的目标不同:.closest要找到指定的目标,.parents遍历到文档根元素,closest向上查找,直到找到一个匹配的就停止查找,parents一直查找到根元素,并将匹配的元素加入集合
结果不同:.closest返回的是包含零个或一个元素的jquery对象,parents返回的是包含零个或一个或多个元素的jquery对象
6、next()
jQuery是一个合集对象,如果想快速查找指定元素集合中每一个元素紧邻的后面同辈元素的元素集合,此时可以用next()方法
理解节点查找关系:
如下class="item-1"元素就是红色部分,那蓝色的class="item-2"就是它的兄弟元素
<ul class="level-3"> <li class="item-1">1</li>
next()无参数
允许我们找遍元素集合中紧跟着这些元素的直接兄弟元素,并根据匹配的元素创建一个新的 jQuery 对象。
注意:jQuery是一个合集对象,所以通过next匹配合集中每一个元素的下一个兄弟元素
next()方法选择性地接受同一类型选择器表达式
同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
7、prev()
jQuery是一个合集对象,如果想快速查找指定元素集合中每一个元素紧邻的前面同辈元素的元素集合,此时可以用prev()方法
理解节点查找关系:
如下蓝色的class="item-2"的li元素,红色的节点就是它的prev兄弟节点
<ul class="level-3"> <li class="item-1">1</li>
prev()无参数
取得一个包含匹配的元素集合中每一个元素紧邻的前一个同辈元素的元素集合
注意:jQuery是一个合集对象,所以通过prev是匹配合集中每一个元素的上一个兄弟元素
prev()方法选择性地接受同一类型选择器表达式
同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
8、sublings()
jQuery是一个合集对象,如果想快速查找指定元素集合中每一个元素的同辈元素,此时可以用siblings()方法
理解节点查找关系:
如下蓝色的class="item-2"的li元素,红色的节点就是它的siblings兄弟节点
<ul class="level-3"> <li class="item-1">1</li>
siblings()无参数
取得一个包含匹配的元素集合中每一个元素的同辈元素的元素集合
注意:jQuery是一个合集对象,所以通过siblings是匹配合集中每一个元素的同辈元素
siblings()方法选择性地接受同一类型选择器表达式
同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
9、add()
jQuery是一个合集对象,通过$()方法找到指定的元素合集后可以进行一系列的操作。$()之后就意味着这个合集对象已经是确定的,如果后期需要再往这个合集中添加一新的元素要如何处理?jQuery为此提供add方法,用来创建一个新的jQuery对象 ,元素添加到匹配的元素集合中
.add()的参数可以几乎接受任何的$(),包括一个jQuery选择器表达式,DOM元素,或HTML片段引用。
简单的看一个案例:
操作:选择所有的li元素,之后把p元素也加入到li的合集中
<ul>
处理一:传递选择器
$(li).add(p)
处理二:传递dom元素
$(li).add(document.getElementsByTagName(p)[0])
还有一种方式,就是动态创建P标签加入到合集,然后插入到指定的位置,但是这样就改变元素的本身的排列了
$(li).add(<p>新的p元素</p>).appendTo(目标位置)
10、each()
jQuery是一个合集对象,通过$()方法找到指定的元素合集后可以进行一系列的操作。比如我们操作$("li").css() 给所有的li设置style值,因为jQuery是一个合集对象,所以css方法内部就必须封装一个遍历的方法,被称为隐式迭代的过程。要一个一个给合集中每一个li设置颜色,这里方法就是each
.each() 方法就是一个for循环的迭代器,它会迭代jQuery对象合集中的每一个DOM元素。每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数
所以大体上了解3个重点:
each是一个for循环的包装迭代器
看一个简单的案例
<ul>
开始迭代li,循环2次
$("li").each(function(index, element) {
这样可以在循环体会做一些逻辑操作了,如果需要提前退出,可以以通过返回 false以便在回调函数内中止循