jQuery对节点的操作封装出了一系列的接口,可以接受HTML字符串、DOM 元素、元素数组、或者jQuery对象,用来插在集合中每个匹配元素的不同位置
HTML结构:
$('.inner').after('<p>Test</p>');
$对象:
$('.container').after($('h2'));
回调函数
一个返回HTML字符串、DOM 元素、 或者 jQuery 对象的函数,插在每个匹配元素的后面。接收元素在集合中的索引位置作为参数。在函数中this指向元素集合中的当前元素:
$('p').after(function() { return '<div>' + this.className + '</div>'; });
看看其源码的实现,内部都掉了了一个domManip方法
append: function() { return this.domManip(arguments, function(elem) { if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { var target = manipulationTarget(this, elem); target.appendChild(elem); } }); }, prepend: function() { return this.domManip(arguments, function(elem) { if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) { var target = manipulationTarget(this, elem); target.insertBefore(elem, target.firstChild); } }); },
.domManip()是jQuery DOM操作的核心函数。dom即Dom元素,Manip是Manipulate的缩写,连在一起就是Dom操作的意思。
对封装的节点操作做了参数上的校正支持,与对应处理的调用:append、prepend、before、after、replaceWith、appendTo、prependTo、insertBefore、insertAfter、replaceAll。
为什么需要用这个domManip函数呢?
我们知道节点操作浏览器提供的接口无非就是那么几个:
appendChild()
通过把一个节点增加到当前节点的childNodes[]组,给文档树增加节点:
cloneNode()
复制当前节点,或者复制当前节点以及它的所有子孙节点:
hasChildNodes()
如果当前节点拥有子节点,则将返回true:
insertBefore()
给文档树插入一个节点,位置在当前节点的指定子节点之前。如果该节点已经存在,则删除之再插入到它的位置:
removeChild()
从文档树中删除并返回指定的子节点:
replaceChild()
从文档树中删除并返回指定的子节点,用另一个节点替换它。
以上接口都有一个特性,传入的是一个节点元素。如果我们传递不是一个dom节点元素,如果是一个字符串,一个函数或者其他呢?
所以针对所有接口的操作,jQuery会抽象出一种参数的处理方案,也就是domManip存在的意义了,针对很多类似接口的参数抽象jQuery内部有很多这样的函数了,如之前属性操作中的jQuery.access。
请验证,完成请求
由于请求次数过多,请先验证,完成再次请求
打开微信扫码自动绑定
绑定后可得到
使用 Ctrl+D 可将课程添加到书签
举报