Welcome

首页 / 脚本样式 / jQuery / Jquery源码分析---DOM元素(下)

Jquery源码分析---DOM元素(下)2010-12-15prk(彭仁夔)5.3.2 insert

在IE中提供了insertAdjacentElement()方法,这个方 法比insertBefore()和appendChild()好用。为了保证兼容性,像 prototype,mootools,Ext都提供了一个类似的方法,之后在扩展出四个方法。 分别在元素的前面或后面,元素的内部开始或内部结束处四个地方插入元素。

Jquery也一样,提供了domManip(),这个函数和 insertAdjacentElement类似,不同的是它采用回调函数做swhere的类似参数, 可见它更为灵活。

// Dom manipulate操作的函数,对于每个 jQuery对象中元素都运行
// 由callback操作args转化成的Dom 元素 集合的函数。
domManip : function(args, table, reverse, callback) {
var clone = this.length > 1, elems; ①
// 对当前的jquery对象中每个元素都进行操作
return this.each(function() {
if (!elems) {// 把args 转化为dom元 素数组,追加的内容 ②
elems = jQuery.clean(args, this.ownerDocument);
if (reverse) elems.reverse ();// 倒序
}
var obj = this;
// Ie Table不兼容,要进行特殊处理
if (table && jQuery.nodeName(this, "table")// 当前元素是table? ③
&& jQuery.nodeName(elems[0], "tr"))// 要追加是tr?
obj = this.getElementsByTagName ("tbody")[0]// 没有tbody,创建追加
|| this.appendChild(this.ownerDocument .createElement ("tbody"));
var scripts = jQuery([]);
jQuery.each (elems, function() {//对于参数转化的每一个dom对象 // 长度大于1,就采用clone。取第一个元素,否则就是本元素
var elem = clone ? jQuery(this).clone(true)[0] : this; ④

// 执行所有 scripts 在所有的元素注入之后
if (jQuery.nodeName(elem, "script"))scripts = scripts.add (elem); ⑤
else { // 除去内部 scripts,同时保存起来, 为了之 后的计算
if (elem.nodeType == 1)
scripts = scripts.add(jQuery("script", elem).remove());⑥
callback.call(obj, elem); ⑦
}
});
scripts.each(evalScript); ⑧
});
}
};

domManip的功能不好形容。从名字的意思来看是指是对dom 元素的操作。其实我们可以理解为它对args参数中的每个元素都传到callback( elem)的回调函数的参数中去。有点像jquery.each(elems,function(i,elem) {})的函数。它的所有的实质的功能都落到回调函数上。与each不一样的是, callback(elem)的this指向每一个jquery对象中的元素。也就是有二个嵌套的 each。一个each是对于jquery对象的操作,遍历每一个元素进行回调操作。第二 个each在回调函数中,就是对于每个元素再次遍历args参数的元素。进行回调操 作。

对于args参数,可以是string,dom元素,(类)数组等,它采用②处 的代码把args转换成dom元素组成的数组(对于有的string转换如td,它会自动 加上<table><tr>)。②处的转换过程只执行一次。Table参数是指 在对表操作时,会不会把追加<tbody>,这个在③处理。①④的代码是为 了防止多次同时运行args中的元素引起的冲突。

⑤⑥⑧可以看出,args 的参数中的元素支持script和元素内部的script运行。最后统一运行这些script 。