在jQuery 1.7.1中调用jQuery.clean()方法的地方有三处,第一次就是在我之前的随笔分析jQuery.buildFramgment()方法里面的,其实还是构造函数的一部分,在处理诸如$('<div>123</div>')形式的参数时会首选调用jQuery.buildFramgment()创建文档片段,而这个方法有依赖jQuery.clean()方法来实现dom转换,所以这个方法的第一个用处就是在构造jQuery对象上面。另外两处则是在两个dom操作方法before和after方法中,主要是处理dom相关操作的,相关源码代码如下:

//创建文档碎片后调用转换为dom
if ( !fragment ) {
fragment = doc.createDocumentFragment();
jQuery.clean( args, doc, fragment, scripts );
} //before方法中调用
before: function() {
if ( this[0] && this[0].parentNode ) {
return this.domManip(arguments, false, function( elem ) {
this.parentNode.insertBefore( elem, this );
});
} else if ( arguments.length ) {
var set = jQuery.clean( arguments );
set.push.apply( set, this.toArray() );
return this.pushStack( set, "before", arguments );
}
},
//after方法中调用 after: function() {
if ( this[0] && this[0].parentNode ) {
return this.domManip(arguments, false, function( elem ) {
this.parentNode.insertBefore( elem, this.nextSibling );
});
} else if ( arguments.length ) {
var set = this.pushStack( this, "after", arguments );
set.push.apply( set, jQuery.clean(arguments) );
return set;
}
},

方法 jQuery.clean( elems, context, fragment, scripts ) 执行的 8 个关键步骤如下:
1)创建一个临时 div 元素,并插入一个安全文档片段中。
2)为 HTML 代码包裹必要的父标签,然后赋值给临时 div 元素的 innerHTML 属性,从而
将 HTML 代码转换为 DOM 元素,之后再层层剥去包裹的父元素,得到转换后的 DOM 元素。
3)移除 IE 6/7 自动插入的空 tbody 元素,插入 IE 6/7/8 自动剔除的前导空白符。
4)取到转换后的 DOM 元素集合。
5)在 IE 6/7 中修正复选框和单选按钮的选中状态。
6)合并转换后的 DOM 元素。
7)如果传入了文档片段 fragment,则提取所有合法的 script 元素存入数组 scripts,并把
其他元素插入文档片段 fragment。
8)最后返回转换后的 DOM 元素数组。

下面开始源码分析:

clean: function( elems, context, fragment, scripts ) {
...
}

还是先分析一下参数:

elems:保存待转换html字符串的数组

为了更好地理解不如还是在前台调用一下然后再看看源码中执行的结果;现在在html页面执行一段js代码(默认在dom加载之后执行)

$('<div>123</div>,<a><223/a>');

然后再看看源码执行的情况,相信了解jQuery源码或者看过我之前随笔的读者都会知道这段这段代码是怎么一步一步走到clean方法里面的,下面直接看执行的结果看看第一个参数的值是什么?

["<div>123</div>,<a><223/a>"]

通过日志方法看到得到的就是一个数组里面包含着传递进来的字符串标签

context:文档对象,该参数在方法 jQuery.buildFragment() 中被修正为正确的文
档对象(变量 doc) ,稍后会调用它的方法 createTextNode() 创建文本节点、调用方法
createElement() 创建临时 div 元素。

由于是通过buildFragment方法传递进来,之前使用的例子会被修改为文档对象document,即使不是后面也会在做进一步处理

‰ fragment:文档片段,作为存放转换后的 DOM 元素的占位符,该参数在 jQuery.
buildFragment() 中被创建。

下面是在源码中输出此参数的结果

参数 scripts:数组,用于存放转换后的 DOM 元素中的 script 元素

jQuery.clean()方法源码分析(一)的更多相关文章

  1. Jquery之isPlainObject源码分析

    今天对Jquery中 isPlainObject 源码分析. 1.  isPlainObject 方法的作用: 用来判断传入参数,是否是对象. 2. 源码分析:isPlainObject: funct ...

  2. Java split方法源码分析

    Java split方法源码分析 public String[] split(CharSequence input [, int limit]) { int index = 0; // 指针 bool ...

  3. invalidate和requestLayout方法源码分析

    invalidate方法源码分析 在之前分析View的绘制流程中,最后都有调用一个叫invalidate的方法,这个方法是啥玩意?我们来看一下View类中invalidate系列方法的源码(ViewG ...

  4. Linq分组操作之GroupBy,GroupJoin扩展方法源码分析

    Linq分组操作之GroupBy,GroupJoin扩展方法源码分析 一. GroupBy 解释: 根据指定的键选择器函数对序列中的元素进行分组,并且从每个组及其键中创建结果值. 查询表达式: var ...

  5. jQuery实现DOM加载方法源码分析

    传统的判断dom加载的方法 使用 dom0级 onload事件来进行触发所有浏览器都支持在最初是很流行的写法 我们都熟悉这种写法: window.onload=function(){ ... }  但 ...

  6. jQuery.extend()方法和jQuery.fn.extend()方法源码分析

    这两个方法用的是相同的代码,一个用于给jQuery对象或者普通对象合并属性和方法一个是针对jQuery对象的实例,对于基本用法举几个例子: html代码如下: <!doctype html> ...

  7. jQuery之ready源码分析

    只要使用过jQuery的,想必对ready都不陌生,$(function(){})和$(document).ready(function(){})的使用更是习以为常. 要说到window.onload ...

  8. 【Java】NIO中Selector的select方法源码分析

    该篇博客的有些内容和在之前介绍过了,在这里再次涉及到的就不详细说了,如果有不理解请看[Java]NIO中Channel的注册源码分析, [Java]NIO中Selector的创建源码分析 Select ...

  9. jQuery1.9.1--attr,prop与val方法源码分析

    这里只介绍这几个方法的源码,这部分引用了一个技巧,钩子对象,用来做兼容fixed的对象,后面也有一些使用.钩子对象具体的兼容细节这里就不详解了. var nodeHook, boolHook, rcl ...

随机推荐

  1. 模拟java.util.Collection一些简单的用法

    /* 需求:模拟java.util.Collection一些简单的用法! 注意:java虚拟机中并没有泛型类型的对象.泛型是通过编译器执行一个被称为类型擦除的前段转换来实现的. 1)用泛型的原生类型替 ...

  2. 关于c#动态加载程序集的一些注意事项

    Assembly下有LoadFile,LoadFrom等方法可以加载程序集. LoadFile只加载你给定路径的那个dll,LoadFrom会自动加载依赖的dll. 如:A依赖B,LoadFile(& ...

  3. timus_1007_bfs

    图像编码 题目描述: 有这样一副图,它有黑白像素,黑像素的坐标在1-10之间.有很多种方法来编码这个图.例如下面的图: 一种表示方法是只描述黑像素,并按x坐标的增序描述,如果x相同,则按y的增序描述, ...

  4. php基础教程-输出Hello World

    <!DOCTYPE html> <!--!文档类型,一个文档类型标记是一种标准通用标记语言的文档类型声明, 它的目的是要告诉标准通用标记语言解析器,它应该使用什么样的文档类型定义(D ...

  5. Nodejs学习笔记(二)——Eclipse中运行调试Nodejs

    前篇<Nodejs学习笔记(一)——初识Nodejs>主要介绍了在搭建node环境过程中遇到的小问题以及搭建Eclipse开发Node环境的前提步骤.本篇主要介绍如何在Eclipse中运行 ...

  6. Windows Azure Web Site (9) Web Site公网IP地址

    <Windows Azure Platform 系列文章目录> 本文会同时介绍国内由世纪互联运维的Azure China和海外Azure Global. 熟悉Windows Azure平台 ...

  7. 圣诞礼物:分享几套漂亮的圣诞节 PSD 素材

    马上就到圣诞节了,这篇文章要给大家分享几套精美的圣诞节相关的 PSD 设计素材,你可以免费下载使用,用于圣诞节相关的设计项目中.这些免费素材能够帮助你节省大量的时间,而且能有很好的效果. 您可能感兴趣 ...

  8. 第20/24周 死锁(Deadlocking)

    大家好,欢迎回到性能调优培训.今天讨论SQL Server里的死锁(Deadlocking),第5个月的培训就结束了.当2个查询彼此等待,没有查询可以继续它的工作就会发生死锁.第一步我会概括介绍下SQ ...

  9. JavaScript之旅(三)

    JavaScript之旅(三) 三.函数 在JavaScript中,定义函数的方式如下: function abs(x) { ... return ...; } 如果没有return,返回结果为und ...

  10. [AngularJS] AngularJS系列(4) 中级篇之指令

    目录 API概览 使用Angular.UI.Bootstrap 自定义指令 scope link 我的指令 angular中的指令可谓是最复杂的一块 但是我们的上传组件就能这么写 效果图: API概览 ...