jQuery—DOM节点总结

  1 DOM创建节点及节点属性
  2 通过JavaScript可以很方便的获取DOM节点,从而进行一系列的DOM操作。但实际上一般开发者都习惯性的先定义好HTML结构,但这样就非常不灵活了。
  3 
  4 试想下这样的情况:如果我们通过AJAX获取到数据之后然后才能确定结构的话,这种情况就需要动态的处理节点了
  5 
  6 本文向大家介绍一下如何使用JavaScript创建div节点元素,主要包括创建div节点元素的属性和创建div节点元素的样式两大部分内容,相信本文介绍一定会让你有所收获。
  7 
  8 先介绍下需要用到的浏览器提供的一些原生的方法(这里不处理低版本的IE兼容问题)
  9 
 10 创建流程比较简单,大体如下:
 11 
 12 创建节点(常见的:元素、属性和文本)
 13 添加节点的一些属性
 14 加入到文档中
 15 流程中涉及的一点方法:
 16 
 17 创建元素:document.createElement
 18 设置属性:setAttribute
 19 添加文本:innerHTML
 20 加入文档:appendChild
 21 如右边代码所示,写一个最简单的元素创建,我们会发现几个问题:
 22 
 23 每一个元素节点都必须单独创建
 24 节点是属性需要单独设置,而且设置的接口不是很统一
 25 添加到指定的元素位置不灵活
 26 最后还有一个最重要的:浏览器兼容问题处理
 27 针对这一系列的DOM操作的问题,jQuery给出了一套非常完美的接口方法,我们之后就开始深入学习
 28 
 29 jQuery节点创建与属性的处理
 30 上一节介绍了通过JavaScript原生接口创建节点,在处理上是非常复杂与繁琐的。我们可以通过使用jQuery来简化了这个过程
 31 
 32 创建元素节点:
 33 
 34 可以有几种方式,后面会慢慢接触。常见的就是直接把这个节点的结构给通过HTML标记字符串描述出来,通过$()函数处理,$("html结构")
 35 
 36 $("<div></div>")
 37 
 38 创建为本节点:
 39 
 40 与创建元素节点类似,可以直接把文本内容一并描述
 41 
 42 $("<div>我是文本节点</div>")
 43 
 44 创建为属性节点:
 45 
 46 与创建元素节点同样的方式
 47 
 48 $("<div id='test' class='aaron'>我是文本节点</div>")
 49 
 50 我们通过jQuery把上一届的代码改造一下,如右边代码所示
 51 
 52 一条一句就搞定了,跟写HTML结构方式是一样的
 53 
 54 $("<div class='right'><div class='aaron'>动态创建DIV元素节点</div></div>")
 55 
 56 这就是jQuery创建节点的方式,让我们保留HTML的结构书写方式,非常的简单、方便和灵活
 57 
 58 DOM内部插入append()与appendTo()
 59 动态创建的元素是不够的,它只是临时存放在内存中,最终我们需要放到页面文档并呈现出来。那么问题来了,怎么放到文档上?
 60 
 61 这里就涉及到一个位置关系,常见的就是把这个新创建的元素,当作页面某一个元素的子元素放到其内部。针对这样的处理,jQuery就定义2个操作的方法
 62 
 63  
 64 
 65 append:这个操作与对指定的元素执行原生的appendChild方法,将它们添加到文档中的情况类似。
 66 
 67 appendTo:实际上,使用这个方法是颠倒了常规的$(A).append(B)的操作,即不是把B追加到A中,而是把A追加到B中。
 68 
 69 
 70 简单的总结就是:
 71 
 72 .append()和.appendTo()两种方法功能相同,主要的不同是语法——内容和目标的位置不同
 73 
 74 append()前面是被插入的对象,后面是要在对象内插入的元素内容
 75 
 76 appendTo()前面是要插入的元素内容,而后面是被插入的对象
 77 
 78  
 79 DOM外部插入after()与before()
 80 节点与节点之前有各种关系,除了父子,祖辈关系,还可以是兄弟关系。之前我们在处理节点插入的时候,接触到了内部插入的几个方法,这节我们开始讲外部插入的处理,也就是兄弟之间的关系处理,这里jQuery引入了2个方法,可以用来在匹配I的元素前后插入内容
 81 
 82 选择器的描述:
 83 
 84  
 85 
 86 before与after都是用来对相对选中元素外部增加相邻的兄弟节点
 87 2个方法都是都可以接收HTML字符串,DOM 元素,元素数组,或者jQuery对象,用来插入到集合中每个匹配元素的前面或者后面
 88 2个方法都支持多个参数传递after(div1,div2,....) 可以参考右边案例代码
 89 注意点:
 90 
 91 after向元素的后边添加html代码,如果元素后面有元素了,那将后面的元素后移,然后将html代码插入
 92 before向元素的前边添加html代码,如果元素前面有元素了,那将前面的元素前移,然后将html代码插
 93 DOM内部插入prepend()与prependTo()
 94 在元素内部进行操作的方法,除了在被选元素的结尾(仍然在内部)通过append与appendTo插入指定内容外,相应的还可以在被选元素之前插入,jQuery提供的方法是prepend与prependTo
 95 
 96 选择器的描述:
 97 
 98  
 99 
100 通过右边代码可以看到prepend与prependTo的使用及区别:
101 
102 .prepend()方法将指定元素插入到匹配元素里面作为它的第一个子元素 (如果要作为最后一个子元素插入用.append()).
103 .prepend()和.prependTo()实现同样的功能,主要的不同是语法,插入的内容和目标的位置不同
104 对于.prepend() 而言,选择器表达式写在方法的前面,作为待插入内容的容器,将要被插入的内容作为方法的参数
105 而.prependTo() 正好相反,将要被插入的内容写在方法的前面,可以是选择器表达式或动态创建的标记,待插入内容的容器作为参数。
106 这里总结下内部操作四个方法的区别:
107 
108 append()向每个匹配的元素内部追加内容
109 prepend()向每个匹配的元素内部前置内容
110 appendTo()把所有匹配的元素追加到另一个指定元素的集合中
111 prependTo()把所有匹配的元素前置到另一个指定的元素集合中
112 DOM外部插入insertAfter()与insertBefore()
113 与内部插入处理一样,jQuery由于内容目标的位置不同,然增加了2个新的方法insertAfter与insertBefore
114 
115  
116 
117 .before()和.insertBefore()实现同样的功能。主要的区别是语法——内容和目标的位置。 对于before()选择表达式在函数前面,内容作为参数,而.insertBefore()刚好相反,内容在方法前面,它将被放在参数里元素的前面
118 .after()和.insertAfter() 实现同样的功能。主要的不同是语法——特别是(插入)内容和目标的位置。 对于after()选择表达式在函数的前面,参数是将要插入的内容。对于 .insertAfter(), 刚好相反,内容在方法前面,它将被放在参数里元素的后面
119 before、after与insertBefore。insertAfter的除了目标与位置的不同外,后面的不支持多参数处理
120 注意事项:
121 
122 insertAfter将JQuery封装好的元素插入到指定元素的后面,如果元素后面有元素了,那将后面的元素后移,然后将JQuery对象插入;
123 insertBefore将JQuery封装好的元素插入到指定元素的前面,如果元素前面有元素了,那将前面的元素前移,然后将JQuery对象插入;
124 DOM节点删除之empty()的基本用法
125 要移除页面上节点是开发者常见的操作,jQuery提供了几种不同的方法用来处理这个问题,这里我们开仔细了解下empty方法
126 
127 empty 顾名思义,清空方法,但是与删除又有点不一样,因为它只移除了 指定元素中的所有子节点。
128 
129 这个方法不仅移除子元素(和其他后代元素),同样移除元素里的文本。因为,根据说明,元素里任何文本字符串都被看做是该元素的子节点。请看下面的HTML:
130 
131 <div class="hello"><p>慕课网</p></div>
132 
133 如果我们通过empty方法移除里面div的所有元素,它只是清空内部的html代码,但是标记仍然留在DOM中
134 
135 //通过empty处理
136 
137 $('.hello').empty()
138 
139  
140 
141 //结果:<p>慕课网</p>被移除
142 
143 <div class="hello"></div>
144 
145 
146 可以参考右边的代码区域:
147 
148 通过empty移除了当前div元素下的所有p元素
149 
150 但是本身id=test的div元素没有被删除
151 
152 DOM节点删除之remove()的有参用法和无参用法
153 remove与empty一样,都是移除元素的方法,但是remove会将元素自身移除,同时也会移除元素内部的一切,包括绑定的事件及与该元素相关的jQuery数据。
154 
155 例如一段节点,绑定点击事件
156 
157 <div class="hello"><p>慕课网</p></div>
158 
159 $('.hello').on("click",fn)
160 
161 如果不通过remove方法删除这个节点其实也很简单,但是同时需要把事件给销毁掉,这里是为了防止"内存泄漏",所以前端开发者一定要注意,绑了多少事件,不用的时候一定要记得销毁
162 
163 通过remove方法移除div及其内部所有元素,remove内部会自动操作事件销毁方法,所以使用使用起来非常简单
164 
165 //通过remove处理
166 
167 $('.hello').remove()
168 
169 //结果:<div class="hello"><p>慕课网</p></div> 全部被移除
170 
171 //节点不存在了,同事事件也会被销毁
172 
173 remove表达式参数:
174 
175 remove比empty好用的地方就是可以传递一个选择器表达式用来过滤将被移除的匹配元素集合,可以选择性的删除指定的节点
176 
177 我们可以通过$()选择一组相同的元素,然后通过remove()传递筛选的规则,从而这样处理
178 
179 对比右边的代码区域,我们可以通过类似于这样处理
180 
181 $("p").filter(":contains('3')").remove()
182 
183 DOM节点删除之empty和remove区别
184 要用到移除指定元素的时候,jQuery提供了empty()与remove([expr])二个方法,两个都是删除元素,但是两者还是有区别
185 
186 empty方法
187 
188 严格地讲,empty()方法并不是删除节点,而是清空节点,它能清空元素中的所有后代节点
189 empty不能删除自己本身这个节点
190 remove方法
191 
192 该节点与该节点所包含的所有后代节点将同时被删除
193 提供传递一个筛选的表达式,删除指定合集中的元素
194 以上就是二者的区别,我们具体通过右边代码部分加深理解
195 
196 DOM节点删除之保留数据的删除操作detach()
197 如果我们希望临时删除页面上的节点,但是又不希望节点上的数据与事件丢失,并且能在下一个时间段让这个删除的节点显示到页面,这时候就可以使用detach方法来处理
198 
199 detach从字面上就很容易理解。让一个web元素托管。即从当前页面中移除该元素,但保留这个元素的内存模型对象。
200 
201 来看看jquery官方文档的解释:
202 
203 这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素。与remove()不同的是,所有绑定的事件、附加的数据等都会保留下来。
204 
205 $("div").detach()这一句会移除对象,仅仅是显示效果没有了。但是内存中还是存在的。当你append之后,又重新回到了文档流中。就又显示出来了。
206 
207 当然这里要特别注意,detach方法是JQuery特有的,所以它只能处理通过JQuery的方法绑定的事件或者数据
208 
209 参考右边的代码区域,通过 $("p").detach()把所有的P元素删除后,再通过append把删除的p元素放到页面上,通过点击文字,可以证明事件没有丢失
210 
211 DOM节点删除之detach()和remove()区别
212 JQuery是一个很大强的工具库,在工作开发中,有些方法因为不常用到,或是没有注意到而被我们忽略。
213 
214 remove()和detach()可能就是其中的一个,可能remove()我们用得比较多,而detach()就可能会很少了
215 
216  通过一张对比表来解释2个方法之间的不同
217 
218 方法名
219 
220 参数
221 
222 事件及数据是否也被移除
223 
224 元素自身是否被移除
225 
226 remove
227 
228 支持选择器表达
229 
230 231 
232 是(无参数时),有参数时要根据参数所涉及的范围
233 
234 detach
235 
236 参数同remove
237 
238 239 
240 情况同remove
241 
242 remove:移除节点
243 
244 无参数,移除自身整个节点以及该节点的内部的所有节点,包括节点上事件与数据
245 有参数,移除筛选出的节点以及该节点的内部的所有节点,包括节点上事件与数据
246 detach:移除节点
247 
248 移除的处理与remove一致
249 与remove()不同的是,所有绑定的事件、附加的数据等都会保留下来
250 例如:$("p").detach()这一句会移除对象,仅仅是显示效果没有了。但是内存中还是存在的。当你append之后,又重新回到了文档流中。就又显示出来了。
251 具体可以参考右边的代码区域的对比
252 
253 DOM替换replaceWith()和replaceAll()
254 之前学习了节点的内插入、外插入以及删除方法,这节会学习替换方法replaceWith
255 
256 .replaceWith( newContent ):用提供的内容替换集合中所有匹配的元素并且返回被删除元素的集合
257 
258 简单来说:用$()选择节点A,调用replaceWith方法,传入一个新的内容B(HTML字符串,DOM元素,或者jQuery对象)用来替换选中的节点A
259 
260 看个简单的例子:一段HTML代码
261 
262 <div>
263 
264     <p>第一段</p>
265 
266     <p>第二段</p>
267 
268     <p>第三段</p>
269 
270 </div>
271 
272 替换第二段的节点与内容
273 
274 $("p:eq(1)").replaceWith('<a style="color:red">替换第二段的内容</a>')
275 
276 通过jQuery筛选出第二个p元素,调用replaceWith进行替换,结果如下
277 
278 <div>
279 
280     <p>第一段</p>
281 
282     <a style="color:red">替换第二段的内容</a>'
283 
284     <p>第三段</p>
285 
286 </div>
287 
288 .replaceAll( target ) :用集合的匹配元素替换每个目标元素
289 
290 .replaceAll()和.replaceWith()功能类似,但是目标和源相反,用上述的HTML结构,我们用replaceAll处理
291 
292 $('<a style="color:red">替换第二段的内容</a>').replaceAll('p:eq(1)')
293 
294 总结:
295 
296 .replaceAll()和.replaceWith()功能类似,主要是目标和源的位置区别
297 .replaceWith()与.replaceAll() 方法会删除与节点相关联的所有数据和事件处理程序
298 .replaceWith()方法,和大部分其他jQuery方法一样,返回jQuery对象,所以可以和其他方法链接使用
299 .replaceWith()方法返回的jQuery对象引用的是替换前的节点,而不是通过replaceWith/replaceAll方法替换后的节点
300 DOM包裹wrap()方法
301 如果要将元素用其他元素包裹起来,也就是给它增加一个父元素,针对这样的处理,JQuery提供了一个wrap方法
302 
303 .wrap( wrappingElement ):在集合中匹配的每个元素周围包裹一个HTML结构
304 
305 简单的看一段代码:
306 
307 <p>p元素</p>
308 
309 给p元素增加一个div包裹
310 
311 $('p').wrap('<div></div>')
312 
313 最后的结构,p元素增加了一个父div的结构
314 
315 <div>
316 
317     <p>p元素</p>
318 
319 </div>
320 
321 .wrap( function ) :一个回调函数,返回用于包裹匹配元素的 HTML 内容或 jQuery 对象
322 
323 使用后的效果与直接传递参数是一样,只不过可以把代码写在函数体内部,写法不同而已
324 
325 以第一个案例为例:
326 
327 $('p').wrap(function() {
328 
329     return '<div></div>';   //与第一种类似,只是写法不一样
330 
331 })
332 
333 注意:
334 
335 .wrap()函数可以接受任何字符串或对象,可以传递给$()工厂函数来指定一个DOM结构。这种结构可以嵌套了好几层深,但应该只包含一个核心的元素。每个匹配的元素都会被这种结构包裹。该方法返回原始的元素集,以便之后使用链式方法。
336 
337 DOM包裹unwrap()方法
338 我们可以通过wrap方法给选中元素增加一个包裹的父元素。相反,如果删除选中元素的父元素要如何处理 ?
339 
340 jQuery提供了一个unwrap()方法 ,作用与wrap方法是相反的。将匹配元素集合的父级元素删除,保留自身(和兄弟元素,如果存在)在原来的位置。
341 
342 看一段简单案例:
343 
344 <div>
345 
346     <p>p元素</p>
347 
348 </div>
349 
350 我要删除这段代码中的div,一般常规的方法会直接通过remove或者empty方法
351 
352 $('div').remove();
353 
354 但是如果我还要保留内部元素p,这样就意味着需要多做很多处理,步骤相对要麻烦很多,为了更便捷,jQuery提供了unwrap方法很方便的处理了这个问题
355 
356 $('p').unwrap();
357 
358 找到p元素,然后调用unwrap方法,这样只会删除父辈div元素了
359 
360 结果:
361 
362 <p>p元素</p>
363 
364 这个方法比较简单,也不接受任何参数,注意参考下案例的使用即可
365 
366 DOM包裹wrapAll()方法
367 wrap是针对单个dom元素处理,如果要将集合中的元素用其他元素包裹起来,也就是给他们增加一个父元素,针对这样的处理,JQuery提供了一个wrapAll方法
368 
369 .wrapAll( wrappingElement ):给集合中匹配的元素增加一个外面包裹HTML结构
370 
371 简单的看一段代码:
372 
373 <p>p元素</p>
374 
375 <p>p元素</p>
376 
377 给所有p元素增加一个div包裹
378 
379 $('p').wrapAll('<div></div>')
380 
381 最后的结构,2个P元素都增加了一个父div的结构
382 
383 <div>
384 
385     <p>p元素</p>
386 
387     <p>p元素</p>
388 
389 </div>
390 
391 .wrapAll( function ) :一个回调函数,返回用于包裹匹配元素的 HTML 内容或 jQuery 对象
392 
393 通过回调的方式可以单独处理每一个元素
394 
395 以上面案例为例,
396 
397 $('p').wrapAll(function() {
398 
399     return '<div><div/>';
400 
401 })
402 
403 以上的写法的结果如下,等同于warp的处理了
404 
405 <div>
406 
407     <p>p元素</p>
408 
409 </div>
410 
411 <div>
412 
413     <p>p元素</p>
414 
415 </div>
416 
417 注意:
418 
419 .wrapAll()函数可以接受任何字符串或对象,可以传递给$()工厂函数来指定一个DOM结构。这种结构可以嵌套多层,但是最内层只能有一个元素。所有匹配元素将会被当作是一个整体,在这个整体的外部用指定的 HTML 结构进行包裹。
420 
421 DOM包裹wrapInner()方法
422 如果要将合集中的元素内部所有的子元素用其他元素包裹起来,并当作指定元素的子元素,针对这样的处理,JQuery提供了一个wrapInner方法
423 
424 .wrapInner( wrappingElement ):给集合中匹配的元素的内部,增加包裹的HTML结构
425 
426 听起来有点绕,可以用个简单的例子描述下,简单的看一段代码:
427 
428 <div>p元素</div>
429 
430 <div>p元素</div>
431 
432 给所有元素增加一个p包裹
433 
434 $('div').wrapInner('<p></p>')
435 
436 最后的结构,匹配的di元素的内部元素被p给包裹了
437 
438 <div>
439 
440     <p>p元素</p>
441 
442 </div>
443 
444 <div>
445 
446     <p>p元素</p>
447 
448 </div>
449 
450 .wrapInner( function ) :允许我们用一个callback函数做参数,每次遇到匹配元素时,该函数被执行,返回一个DOM元素,jQuery对象,或者HTML片段,用来包住匹配元素的内容
451 
452 以上面案例为例,
453 
454 $('div').wrapInner(function() {
455 
456     return '<p></p>';
457 
458 })
459 
460 以上的写法的结果如下,等同于第一种处理了
461 
462 <div>
463 
464     <p>p元素</p>
465 
466 </div>
467 
468 <div>
469 
470     <p>p元素</p>
471 
472 </div>
473 
474 注意:
475 
476  当通过一个选择器字符串传递给.wrapInner() 函数,其参数应该是格式正确的 HTML,并且 HTML 标签应该是被正确关闭的。
477 
478 jQuery遍历之children()方法
479 jQuery是一个合集对象,如果想快速查找合集里面的第一级子元素,此时可以用children()方法。这里需要注意:.children(selector) 方法是返回匹配元素集合中每个元素的所有子元素(仅儿子辈,这里可以理解为就是父亲-儿子的关系)
480 
481 理解节点查找关系:
482 
483 <div class="div">
484 
485     <ul class="son">
486 
487         <li class="grandson">1</li>
488 
489     </ul>
490 
491 </div>
492 
493 代码如果是$("div").children(),那么意味着只能找到ul,因为div与ul是父子关系,li与div是祖辈关系,因此无法找到。
494 
495 children()无参数
496 
497 允许我们通过在DOM树中对这些元素的直接子元素进行搜索,并且构造一个新的匹配元素的jQuery对象
498 
499 注意:jQuery是一个合集对象,所以通过children是匹配合集中每一给元素的第一级子元素
500 
501 .children()方法选择性地接受同一类型选择器表达式
502 
503 $("div").children(".selected")
504 
505 同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
506 
507 jQuery遍历之find()方法
508 jQuery是一个合集对象,如果想快速查找DOM树中的这些元素的后代元素,此时可以用find()方法,这也是开发使用频率很高的方法。这里要注意 children与find方法的区别,children是父子关系查找,find是后代关系(包含父子关系)
509 
510 理解节点查找关系:
511 
512 <div class="div">
513 
514     <ul class="son">
515 
516         <li class="grandson">1</li>
517 
518     </ul>
519 
520 </div>
521 
522 代码如果是$("div").find("li"),此时,li与div是祖辈关系,通过find方法就可以快速的查找到了。
523 
524 .find()方法要注意的知识点:
525 
526 find是遍历当前元素集合中每个元素的后代。只要符合,不管是儿子辈,孙子辈都可以。
527 与其他的树遍历方法不同,选择器表达式对于 .find() 是必需的参数。如果我们需要实现对所有后代元素的取回,可以传递通配选择器 '*'528 find只在后代中遍历,不包括自己。
529 选择器 context 是由 .find() 方法实现的;因此,$('.item-ii').find('li') 等价于 $('li', '.item-ii')(找到类名为item-ii的标签下的li标签)。
530 注意重点:
531 
532 .find()和.children()方法是相似的
533 
534 1.children只查找第一级的子节点
535 
536 2.find查找范围包括子节点的所有后代节点
537 
538 jQuery遍历之parent()方法
539 jQuery是一个合集对象,如果想快速查找合集里面的每一个元素的父元素(这里可以理解为就是父亲-儿子的关系),此时可以用parent()方法
540 
541 因为是父元素,这个方法只会向上查找一级
542 
543 理解节点查找关系:
544 
545 <div class="div">
546 
547     <ul class="son">
548 
549         <li class="grandson">1</li>
550 
551     </ul>
552 
553 </div>
554 
555 查找ul的父元素div, $(ul).parent(),就是这样简单的表达
556 
557 parent()无参数
558 
559 parent()方法允许我们能够在DOM树中搜索到这些元素的父级元素,从有序的向上匹配元素,并根据匹配的元素创建一个新的 jQuery 对象
560 
561 注意:jQuery是一个合集对象,所以通过parent是匹配合集中每一个元素的父元素
562 
563 parent()方法选择性地接受同一型选择器表达式
564 
565 同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
566 
567 jQuery遍历之parents()方法
568 jQuery是一个合集对象,如果想快速查找合集里面的每一个元素的所有祖辈元素,此时可以用parents()方法
569 
570 其实也类似find与children的区别,parent只会查找一级,parents则会往上一直查到查找到祖先节点
571 
572 理解节点查找关系:
573 
574 <div class="div">
575 
576     <ul class="son">
577 
578         <li class="grandson">1</li>
579 
580     </ul>
581 
582 </div>
583 
584 在li节点上找到祖 辈元素div, 这里可以用$("li").parents()方法
585 
586 parents()无参数
587 
588 parents()方法允许我们能够在DOM树中搜索到这些元素的祖先元素,从有序的向上匹配元素,并根据匹配的元素创建一个新的 jQuery 对象;
589 
590 返回的元素秩序是从离他们最近的父级元素开始的
591 
592 注意:jQuery是一个合集对象,所以通过parent是匹配合集中所有元素的祖辈元素
593 
594 parents()方法选择性地接受同一型选择器表达式
595 
596 同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
597 
598 注意事项:
599 
600 1 .parents()和.parent()方法是相似的,但后者只是进行了一个单级的DOM树查找
601 
602 2  $( "html" ).parent()方法返回一个包含document的集合,而$( "html" ).parents()返回一个空集合。
603 
604 jQuery遍历之closest()方法
605 以选定的元素为中心,往内查找可以通过find、children方法。如果往上查找,也就是查找当前元素的父辈祖辈元素,jQuery提供了closest()方法,这个方法类似parents但是又有一些细微的区别,属于使用频率很高的方法
606 
607 closest()方法接受一个匹配元素的选择器字符串
608 
609 从元素本身开始,在DOM 树上逐级向上级元素匹配,并返回最先匹配的祖先元素
610 
611 例如:在div元素中,往上查找所有的li元素,可以这样表达
612 
613 $("div").closet("li')
614 
615 注意:jQuery是一个合集对象,所以通过closest是匹配合集中每一个元素的祖先元素
616 
617 closest()方法给定的jQuery集合或元素来过滤元素
618 
619 同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个jQuery的对象
620 
621 注意事项:在使用的时候需要特别注意下
622 
623 粗看.parents()和.closest()是有点相似的,都是往上遍历祖辈元素,但是两者还是有区别的,否则就没有存在的意义了
624 
625 起始位置不同:.closest开始于当前元素 .parents开始于父元素
626 遍历的目标不同:.closest要找到指定的目标,.parents遍历到文档根元素,closest向上查找,直到找到一个匹配的就停止查找,parents一直查找到根元素,并将匹配的元素加入集合
627 结果不同:.closest返回的是包含零个或一个元素的jquery对象,parents返回的是包含零个或一个或多个元素的jquery对象
628 jQuery遍历之next()方法
629 jQuery是一个合集对象,如果想快速查找指定元素集合中每一个元素紧邻的后面同辈元素的元素集合,此时可以用next()方法
630 
631 理解节点查找关系:
632 
633 如下class="item-1"元素就是红色部分,那蓝色的class="item-2"就是它的兄弟元素
634 
635 <ul class="level-3">
636 
637     <li class="item-1">1</li>
638 
639     <li class="item-2">2</li>
640 
641     <li class="item-3">3</li>
642 
643 </ul>
644 
645 next()无参数
646 
647 允许我们找遍元素集合中紧跟着这些元素的直接兄弟元素,并根据匹配的元素创建一个新的 jQuery 对象。
648 
649 注意:jQuery是一个合集对象,所以通过next匹配合集中每一个元素的下一个兄弟元素
650 
651 next()方法选择性地接受同一类型选择器表达式
652 
653 同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
654 
655 jQuery遍历之prev()方法
656 jQuery是一个合集对象,如果想快速查找指定元素集合中每一个元素紧邻的前面同辈元素的元素集合,此时可以用prev()方法
657 
658 理解节点查找关系:
659 
660 如下蓝色的class="item-2"的li元素,红色的节点就是它的prev兄弟节点
661 
662 <ul class="level-3">
663 
664     <li class="item-1">1</li>
665 
666     <li class="item-2">2</li>
667 
668     <li class="item-3">3</li>
669 
670 </ul>
671 
672 prev()无参数
673 
674 取得一个包含匹配的元素集合中每一个元素紧邻的前一个同辈元素的元素集合
675 
676 注意:jQuery是一个合集对象,所以通过prev是匹配合集中每一个元素的上一个兄弟元素
677 
678 prev()方法选择性地接受同一类型选择器表达式
679 
680 同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
681 
682 jQuery遍历之siblings()
683 jQuery是一个合集对象,如果想快速查找指定元素集合中每一个元素的同辈元素,此时可以用siblings()方法
684 
685 理解节点查找关系:
686 
687 如下蓝色的class="item-2"的li元素,红色的节点就是它的siblings兄弟节点
688 
689 <ul class="level-3">
690 
691     <li class="item-1">1</li>
692 
693     <li class="item-2">2</li>
694 
695     <li class="item-3">3</li>
696 
697 </ul>
698 
699 siblings()无参数
700 
701 取得一个包含匹配的元素集合中每一个元素的同辈元素的元素集合
702 
703 注意:jQuery是一个合集对象,所以通过siblings是匹配合集中每一个元素的同辈元素
704 
705 siblings()方法选择性地接受同一类型选择器表达式
706 
707 同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
708 
709 jQuery遍历之add()方法
710 jQuery是一个合集对象,通过$()方法找到指定的元素合集后可以进行一系列的操作。$()之后就意味着这个合集对象已经是确定的,如果后期需要再往这个合集中添加一新的元素要如何处理?jQuery为此提供add方法,用来创建一个新的jQuery对象 ,元素添加到匹配的元素集合中
711 
712 .add()的参数可以几乎接受任何的$(),包括一个jQuery选择器表达式,DOM元素,或HTML片段引用。
713 
714 简单的看一个案例:
715 
716 操作:选择所有的li元素,之后把p元素也加入到li的合集中
717 
718 <ul>
719 
720     <li>list item 1</li>
721 
722     <li>list item 3</li>
723 
724 </ul>
725 
726 <p>新的p元素</p>
727 
728 处理一:传递选择器
729 
730 $('li').add('p')
731 
732 处理二:传递dom元素
733 
734 $('li').add(document.getElementsByTagName('p')[0])
735 
736 还有一种方式,就是动态创建P标签加入到合集,然后插入到指定的位置,但是这样就改变元素的本身的排列了
737 
738  $('li').add('<p>新的p元素</p>').appendTo(目标位置)
739 
740 jQuery遍历之each()
741 jQuery是一个合集对象,通过$()方法找到指定的元素合集后可以进行一系列的操作。比如我们操作$("li").css('') 给所有的li设置style值,因为jQuery是一个合集对象,所以css方法内部就必须封装一个遍历的方法,被称为隐式迭代的过程。要一个一个给合集中每一个li设置颜色,这里方法就是each
742 
743 .each() 方法就是一个for循环的迭代器,它会迭代jQuery对象合集中的每一个DOM元素。每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数
744 
745 所以大体上了解3个重点:
746 
747 each是一个for循环的包装迭代器
748 
749 each通过回调的方式处理,并且会有2个固定的实参,索引与元素
750 
751 each回调方法中的this指向当前迭代的dom元素
752 
753 看一个简单的案例
754 
755 <ul>
756 
757     <li>慕课网</li>
758 
759     <li>Aaron</li>
760 
761 </ul>
762 
763 开始迭代li,循环2次
764 
765 $("li").each(function(index, element) {
766 
767      index 索引 0,1
768 
769      element是对应的li节点 li,li
770 
771      this 指向的是li
772 
773 })
774 
775 这样可以在循环体会做一些逻辑操作了,如果需要提前退出,可以以通过返回 false以便在回调函数内中止循

 

posted @ 2017-10-10 18:05  厉害了我的哥丶  阅读(214)  评论(0)    收藏  举报