DOM节点的创建
- 通过源生JS,创建DOM节点的流程大体如下:
- 创建节点(常见的:元素、属性和文本) document.createElement
- 添加节点的一些属性 setAttribute、innerHTML
- 加入到文档中 appendChild
- 如下边代码所示,写一个最简单的元素创建,我们会发现几个问题:
- 每一个元素节点都必须单独创建
- 节点是属性需要单独设置,而且设置的接口不是很统一
- 添加到指定的元素位置不灵活
- 最后还有一个最重要的:浏览器兼容问题处理
- 针对这一系列的DOM操作的问题,jQuery给出了一套非常完美的接口方法
- jQuery节点创建与属性的处理:
- 通过$()函数处理,$("html结构"),如:
- $("<div></div>")
- $("<div>我是文本节点</div>")
- $("<div id='test' class='aaron'>我是文本节点</div>")
- $("<div class='right'><div class='aaron'>动态创建DIV元素节点</div></div>")
DOM节点的插入(插入的各种姿势 - -)
- DOM内部插入append()与appendTo()、prepend()与prependTo()
- append(),前面是被插入的对象,后面是要在对象内插入的元素内容,append() 这个操作与对指定的元素执行原生的appendChild方法,将它们添加到文档中的情况类似。
- appendTo(),刚好相反,前面是要插入的元素内容,而后面是被插入的对象,appendTo() 实际上,使用这个方法是颠倒了常规的$(A).append(B)的操作,即不是把B追加到A中,而是把A追加到B中。
- prepend() 向每个匹配的元素内部前置内容,如$('.aaron1').prepend('<p>prepend增加的p元素</p>');
- prependTo() 把所有匹配的元素前置到另一个指定的元素集合中, 如$('<p>prependTo增加的p元素</p>').prependTo($('.aaron2'));
- prepend()方法将指定元素插入到匹配元素里面作为它的第一个子元素 (如果要作为最后一个子元素插入用append()
-
- DOM外部插入after()与before()、insertAfter()与insertBefore()
- after(),向元素的后边添加html代码,如果元素后面有元素了,那将后面的元素后移,然后将html代码插入
- before(),向元素的前边添加html代码,如果元素前面有元素了,那将前面的元素前移,然后将html代码插
- before与after都是用来对相对选中元素外部增加相邻的兄弟节点
- 2个方法都支持多个参数传递after(div1,div2,....) 可以参考下边案例代码
- 2个方法都是都可以接收HTML字符串,DOM 元素,元素数组,或者jQuery对象,用来插入到集合中每个匹配元素的前面或者后面
- insertAfter() 和 after() 实现同样的功能,但不支持多参数处理了。主要的不同是语法——特别是(插入)内容和目标的位置。 对于after()选择表达式在函数的前面,参数是将要插入的内容。对于 .insertAfter(), 刚好相反,内容在方法前面,它将被放在参数里元素的后面
- insertBefore() 和 before() 实现同样的功能,但不支持多参数处理了。主要的区别是语法——内容和目标的位置。 对于 before() 选择表达式在函数前面,内容作为参数,而 insertBefore() 刚好相反,内容在方法前面,它将被放在参数里元素的前面
- 再简单总结一下:
- append()是受,appendTo()是攻,都是内部下面插入。
- prepend()是受,prependTo()是攻,都是内部上面插入。
- before()和after()是外部插入,一个从前面插,一个从后面插。
- append是一起挤挤;before,after是自己带个小板凳
DOM节点的删除
- empty(),它只是清空内部的html代码,但是标记仍然留在DOM中
- remove(),它会将元素自身移除,同时也会移除元素内部的一切,包括绑定的事件及与该元素相关的jQuery数据。remove() 内部会自动操作事件销毁方法,前端开发者一定要注意,为了防止"内存泄漏",绑了多少事件,不用的时候一定要记得销毁。
- remove()无参用法:无参数,移除自身整个节点以及该节点的内部的所有节点,包括节点上事件与数据
- remove()有参用法:有参数,移除筛选出的节点以及该节点的内部的所有节点,包括节点上事件与数据
- detach(),DOM节点删除但保留数据的删除操作。这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素。与remove()不同的是,所有绑定的事件、附加的数据等都会保留下来。$("div").detach() 这一句会移除对象,仅仅是显示效果没有了。但是内存中还是存在的。当你append之后,又重新回到了文档流中。就又显示出来了。当然这里要特别注意,detach方法是JQuery特有的,所以它只能处理通过JQuery的方法绑定的事件或者数据
- 严格地讲,empty()方法并不是删除节点,而是清空节点,它能清空元素中的所有后代节点。empty不能删除自己本身这个节点
- remove比empty好用的地方就是可以传递一个选择器表达式用来过滤将被移除的匹配元素集合,可以选择性的删除指定的节点。我们可以通过$()选择一组相同的元素,然后通过remove() 传递筛选的规则,从而这样处理
-
- 再简单总结一下:
- empty是自宫,JJ还在
- remove是自杀,尸骨无存
DOM节点的复制与替换
- 克隆 clone() ,复制所有匹配的元素集合,包括所有匹配元素、匹配元素的下级元素、文字节点。但是需要注意,如果节点有事件或者数据之类的其他处理,我们需要通过 clone(ture) 传递一个布尔值ture用来指定,这样不仅仅只是克隆单纯的节点结构,还要把附带的事件与数据给一并克隆了
- clone()方法是jQuery扩展的,只能处理通过jQuery绑定的事件与数据
- 替换 replaceWith( newContent ):用提供的内容替换集合中所有匹配的元素并且返回被删除元素的集合
- 替换 replaceAll( target ) :用集合的匹配元素替换每个目标元素
- .replaceAll()和.replaceWith()功能类似,主要是目标和源的位置区别,其实记住replaceWith就可以了。
- .replaceWith()方法,和大部分其他jQuery方法一样,返回jQuery对象,所以可以和其他方法链接使用
- .replaceWith()和.html()实现的功能确实很像,但是最重要的一点 html()只是把所匹配到的节点里的内容给替换掉,而replaceWith()是把匹配到的这节点替换掉
- 包裹 wrap( wrappingElement ):在集合中匹配的每个元素周围包裹一个HTML结构
- 包裹 wrap( function ) :一个回调函数,返回用于包裹匹配元素的 HTML 内容或 jQuery 对象。使用后的效果与直接传递参数是一样,只不过可以把代码写在函数体内部,写法不同而已
- 删除包裹 unwarp() :作用与wrap方法是相反的。将匹配元素集合的父级元素删除,保留自身(和兄弟元素,如果存在)在原来的位置。
- 我要删除一段代码中的div,一般常规的方法会直接通过remove或者empty方法,$('div').remove(); 但是如果我还要保留内部元素p,这样就意味着需要多做很多处理,步骤相对要麻烦很多,为了更便捷,jQuery提供了unwarp()方法很方便的处理了这个问题 $('p').unwarp(); 找到p元素,然后调用unwarp方法,这样只会删除父辈div元素了。这个方法比较简单,也不接受任何参数,$('p').unwrap('在此处随便加任何字符串都会被忽略的,完全不影响这个功能')
- 全包裹 wrapAll( wrappingElement ):给集合中匹配的元素增加一个外面包裹HTML结构
- 全包裹 wrapAll( function ):一个回调函数,返回用于包裹匹配元素的 HTML 内容或 jQuery 对象
- $('p').wrap('<div></div>'); // 单独给每个p加个div
- $('p').wrapAll('<div></div>'); // 给所有p元素,增加一个父容器div
- wrapInner( wrappingElement ):给集合中匹配的元素的内部,增加包裹的HTML结构
- wrapInner( function ) :允许我们用一个callback函数做参数,每次遇到匹配元素时,该函数被执行,返回一个DOM元素,jQuery对象,或者HTML片段,用来包住匹配元素的内容
- wrap穿小外套,wrapAll穿大外套,wrapInner穿内衣,unwrap脱衣,remove自杀,empty自宫
jQuery遍历
- children():允许我们通过在DOM树中对这些元素的直接子元素进行搜索,并且构造一个新的匹配元素的jQuery对象。
- children(selector) 方法是返回匹配元素集合中每个元素的所有子元素(仅儿子辈,这里可以理解为就是父亲-儿子的关系)
- find():遍历当前元素集合中每个元素的后代。只要符合,不管是儿子辈,孙子辈都可以。
- find只在后代中遍历,不包括自己。
- 与其他的树遍历方法不同,选择器表达式对于 .find() 是必需的参数。如果我们需要实现对所有后代元素的取回,可以传递通配选择器 '*'。
- find()方法可以找到孙元素。children()方法只能找到第一级子元素,找不到下一层
- find()相当于空格。children相当于 >
- parent() : 查找合集里面的每一个元素的父元素。因为是父元素,这个方法只会向上查找一级。
- 同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
- parents():查找合集里面的每一个元素的所有祖辈元素,其实也类似find与children的区别,parent只会查找一级,parents则会往上一直查到查找到祖先节点。
- $( "html" ).parent()方法返回一个包含document的集合,而$( "html" ).parents()返回一个空集合。
- closest():从元素本身开始,在DOM 树上逐级向上级元素匹配,并返回最先匹配的祖先元素。此方法接受一个匹配元素的选择器字符串
- 粗看.parents()和.closest()是有点相似的,都是往上遍历祖辈元素,但是两者还是有区别的,否则就没有存在的意义了
- 起始位置不同:.closest开始于当前元素 .parents开始于父元素
- 遍历的目标不同:.closest要找到指定的目标,.parents遍历到文档根元素,closest向上查找,直到找到一个匹配的就停止查找,parents一直查找到根元素,并将匹配的元素加入集合
- 结果不同:.closest返回的是包含零个或一个元素的jquery对象,parents返回的是包含零个或一个或多个元素的jquery对象
- next():查找指定元素集合中每一个元素紧邻的后面同辈元素的元素集合
- next()方法选择性地接受同一类型选择器表达式,同样的也是因为jQuery是合集对象,可能需要对这个合集对象进行一定的筛选,找出目标元素,所以允许传一个选择器的表达式
- prev(),查找指定元素集合中每一个元素紧邻的前面同辈元素的元素集合
- siblings():查找指定元素集合中每一个元素的同辈元素
- add() :用来创建一个新的jQuery对象 ,元素添加到匹配的元素集合中
- .add()的参数可以几乎接受任何的$(),包括一个jQuery选择器表达式,DOM元素,或HTML片段引用。
- each():该方法是一个for循环的迭代器,它会迭代jQuery对象合集中的每一个DOM元素。每次回调函数执行时,会传递当前循环次数作为参数(从0开始计数
- jQuery是一个合集对象,通过$()方法找到指定的元素合集后可以进行一系列的操作。比如我们操作$("li").css('') 给所有的li设置style值,因为jQuery是一个合集对象,所以css方法内部就必须封装一个遍历的方法,被称为隐式迭代的过程。要一个一个给合集中每一个li设置颜色,这里方法就是each
- each是一个for循环的包装迭代器
- each通过回调的方式处理,并且会有2个固定的实参,索引与元素
- each回调方法中的this指向当前迭代的dom元素