实现原理
方法 jQuery.builfFragment(args, nodes, scripts)先创建一个文档片段 DocumentFragment, 然后调用方法 jQuery.clean(elems, context, fragment, scripts)将 HTML 代码转换为 DOM 元素, 并存储在创建的文档片段中
文档片段 DocumentFragment 表示文档的一部分, 但不属于文档树. 当把 DocumentFragment 插入文档树时, 插入的不是 DocumentFragment 自身, 而是他的所有子孙节点, 即可以一次向文档树中插入多个节点. 当需要插入大量节点时, 相比逐个插入节点, 使用 ocumentFragment 一次插入多个节点, 性能的提升会非常明显
如果 HTML 代码符合缓存条件, 方法 jQuery.buildFragment()还会把转换后的 DOM 元素缓存起来, 下次转换相同的代码时, 直接从缓存中读取, 不需要重复转换
方法执行步骤
jQuery.buildFragment(args, nodes, scripts)执行步骤:
- 如果 HTML 代码符合缓存条件, 则尝试从缓存对象 jQuery.fragments 中读取缓存的 DOM 元素
- 创建文档片段 DocumentFragment
- 调用方法 jQuery.clean(elems, context, Fragment, scripts) 将 HTML 代码转换为 DOM 元素, 并存储在创建的文档片段中
- 如果 HTML 代码符合缓存条件,则把转换后的 DOM 元素防褥缓存对象 jQuery.Fragments
- 最后返回文档片段和缓存状态 { fragment: fragment, cacheable: cacheable }
jQuery.buildFragment() 方法源码
方法定义
1 | jQuery.buildFragment(args, nodes, scripts) {} |
参数:
- ages: 数组, 含有待转换的 DOM 元素的 HTML 代码
- nodes: 数组, 含有文档对象、jQuery 对象或 DOM 元素, 用于修正创建文档片段 DocumentFragment 的文档对象
- scripts: 数组, 用于存放 HTML 代码中的 script 元素. 方法 jQuery.Fragment() 会把该参数传给方法 jQuery.clean(), 后者把 HTML 代码转换为 DOM 元素后, 会提取其中的 script 元素并存入数组 scrtips
定义局部变量, 修正文档对象 doc
1 | var Fragment, // 指向稍后可能创建的文档片段 Document Fragment |
尝试从缓存对象 jQuery.fragments 中读取缓存的 DOM 元素
如果 HTML 代码符合缓存条件, 则尝试从缓存对象 jQuery.fragments 中读取缓存的 DOM 元素
- 数组 args 长度为 1, 且第一个元素是字符串, 即数组 args 中只有一段 HTML 代码
- HTML 代码长度小于 512, 否则可能会导致缓存占用内存过大
- 文档对象 doc 是当前文档对象, 即之缓存为当前文档创建的 DOM 元素
- HTML 代码已左尖括号开头, 即只缓存 DOM 元素, 不缓存文本节点
- HTML 代码中不能含有
<script><object><embed><option><style>标签 - 当前浏览器可以正确的复制单选按钮核复选框的选中状态 checked, 或者 HTML 代码中的单选按钮和复选按钮没有被选中
- 当前浏览器可以正确的赋值 HTML5 元素, 或者 HTML 代码中不含有 HTML5 标签
1 | if(args.length === 1 |
转换 HTML 代码为 DOM 元素
先创建一个文档片段 DocumentFragment, 然后调用方法 jQuery.clean(elems, context, fragment, scripts) 将 HTML 代码转换为 DOM 元素, 并存储在创建的文档片段中
1 | // 如果为 true 表示需要直型转换过程 |
把转换后的 DOM 元素防褥缓存对象 jQuery.fragments
如果 HTML 代码符合缓存条件, 则把转换后的 DOM 元素放入缓存对象 jQuery.fragment 中
1 | // 如果符合缓存条件 就缓存 |
返回文档片段和缓存状态
1 | /* |
总结
