jQuery源码分析之appendTo,prependTo,insertBefore,insertAfter,replaceWith函数

源码如下:请提前阅读阅读

var deletedIds = [];
var push = deletedIds.push;
jQuery.each({
	appendTo: "append",
	prependTo: "prepend",
	insertBefore: "before",
	insertAfter: "after",
	replaceAll: "replaceWith"
}, function( name, original ) {
	jQuery.fn[ name ] = function( selector ) {
		var elems,
		i = 0,
		ret = [],
//通过selector获取到选择的对象!
			insert = jQuery( selector ),
//传入参数的个数,下标的最大值
			last = insert.length - 1;
		for ( ; i <= last; i++ ) {
//如果是传入参数的最后一个对象的下标,那么返回调用对象,否则返回克隆对象
//这里elems是jQuery对象
		elems = i === last ? this : this.clone(true);
//把参数对象封装为jQuery对象,调用该jQuery对象的original方法,也就是
//底层的append,prepend,before,after,replaceWith方法,传入的参数
//调用对象!
		jQuery( insert[i] )[ original ]( elems );
// Modern browsers can apply jQuery collections as arrays,
//but oldIE needs a .get()
//现代浏览器可以把jQuery集合作为数组,但是旧版本的IE浏览器不行,所以把elems
//作为JS集合对象!
//这个ret是空数组[]
			push.apply( ret, elems.get() );
		}
		//这里的length是2,因为调用者对象的length是2,$("p").length=2
        //  alert(ret.length);
		//打印"n1n3"说明ret里面放入了两次调用对象组成的DOM对象集合
		//alert(ret[0].id+ret[1].id);
		return this.pushStack( ret )
	};
});
$("p").appendTo("#n3");
注意:appendTo,prependTo,insertBefore,insertAfter,replaceAll底层调用的都是append,prepend,before,after,replaceWith,所以如果传入的参数是文档中已经存在的对象那么该对象将会从原来的位置上消失!

总结:

(1)这些方法返回的对象是一个jQuery对象,该对象保存了所有应该被添加的对象,也就是参数中的那些对象。之所以返回jQuery对象是通过pushStack完成的!

(2)该方法底层调用的before/after等方法,所以也会发生"buildFragment不创建对象(参数对象和调用对象一样)/元素移动(该DOM已经存在)"现象!

(3)上面ret中放的是副本,因为上面是this.clone(true),而且是会复制该元素的所有的数据和事件!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值