jQuery3.0中的buildFragment私有函数详解


Posted in Javascript onAugust 16, 2016

时隔 3 个月,jQuery 团队终于发布了 3.0 Alpha 版本。有两个版本 jQuery compat 3.0 和 jQuery 3.0。

jQuery compat 3.0 对应之前的 1.x, 兼容更多的浏览器,对于IE支持到 8.0 版本

jQuery 3.0 对应之前的 2.x,关注更新的浏览器,对于IE支持到 9.0 版本

此外, 3.0还增加了对 Yandex 浏览器的支持,一款来自俄罗斯的浏览器。

下面看下jQuery3.0中的buildFragment。

在 jQuery3.0中,buildFragment 是一个私有函数,用来构建一个包含子节点 fragment 对象。这个 fragment 在 DOM1 中就已经有了,所有浏览器都支持。当频繁操作(添加、插入) DOM 时使用该方法可以提高性能,John resig 做过一个测试及一篇博客。

jQuery3.0 中 buildFragment 只在 domManip 和 jQuery.parseHTML 中使用,domManip 则被 DOM 操作如 append、prepend、before、after 等方法的所依赖。

如下图

jQuery3.0中的buildFragment私有函数详解

buildFragment 函数有 5 个参数,源码如下

function buildFragment( elems, context, scripts, selection, ignored ) {
var elem, tmp, tag, wrap, contains, j,
fragment = context.createDocumentFragment(),
nodes = [],
i = 0,
l = elems.length;
for ( ; i < l; i++ ) {
elem = elems[ i ];
if ( elem || elem === 0 ) {
// Add nodes directly
if ( jQuery.type( elem ) === "object" ) {
// Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit
jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
// Convert non-html into a text node
} else if ( !rhtml.test( elem ) ) {
nodes.push( context.createTextNode( elem ) );
// Convert html into DOM nodes
} else {
tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
// Deserialize a standard representation
tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
wrap = wrapMap[ tag ] || wrapMap._default;
tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
// Descend through wrappers to the right content
j = wrap[ 0 ];
while ( j-- ) {
tmp = tmp.lastChild;
}
// Support: Android <=4.0 only, PhantomJS 1 only
// push.apply(_, arraylike) throws on ancient WebKit
jQuery.merge( nodes, tmp.childNodes );
// Remember the top-level container
tmp = fragment.firstChild;
// Ensure the created nodes are orphaned (#12392)
tmp.textContent = "";
}
}
}
// Remove wrapper from fragment
fragment.textContent = "";
i = 0;
while ( ( elem = nodes[ i++ ] ) ) {
// Skip elements already in the context collection (trac-4087)
if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
if ( ignored ) {
ignored.push( elem );
}
continue;
}
contains = jQuery.contains( elem.ownerDocument, elem );
// Append to fragment
tmp = getAll( fragment.appendChild( elem ), "script" );
// Preserve script evaluation history
if ( contains ) {
setGlobalEval( tmp );
}
// Capture executables
if ( scripts ) {
j = 0;
while ( ( elem = tmp[ j++ ] ) ) {
if ( rscriptType.test( elem.type || "" ) ) {
scripts.push( elem );
}
}
}
}
return fragment;
}

该方法主要执行步骤

通过第二个参数 content 创建 fragment

通过第一个参数 elems 构建 nodes ,将 elems 内元素转成 DOM 元素存放于数组 nodes 中

将 nodes 里元素循环放入添加到文档碎片 fragment 上

返回 fragment

重点在第 2 步,构建 nodes,有 3 种情形

elem 是 DOM 元素(根据nodeType判断),直接放入 nodes 数组中

elem 是字符串且不是 HTML tag,创建文本节点对象(textNode),放入 nodes 数组中

elem 是字符串且是 HTML tag,将其转成 DOM 元素,放入 nodes 数组中

如图示

jQuery3.0中的buildFragment私有函数详解

后面的两个参数需要注意下

1. 最后两个参数 selection 和 ignored 只在 replaceWith 方法里使用。需要了解的是 replaceWith 只做节点替换,不会替换先前元素的所有数据(Data),比如绑定事件,$.data 都不会被新元素拥有。

jQuery3.0中的buildFragment私有函数详解

2. scripts 参数只在 jQuery.parseHTML 方法里使用(domManip里传false),当 jQuery.parseHTML 的第三个参数 keepScripts 为 false 时将删除节点里所有的 script tag

jQuery3.0中的buildFragment私有函数详解

以上所述是小编给大家介绍的jQuery3.0中的buildFragment私有函数详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
关于jquery动态增减控件的一些想法和小插件
Aug 01 Javascript
不到30行JS代码实现Excel表格的方法
Nov 15 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
Nov 26 Javascript
easyui Draggable组件实现拖动效果
Aug 19 Javascript
js实现div在页面拖动效果
May 04 Javascript
Svg.js实例教程及使用手册详解(一)
May 16 Javascript
php 修改密码实现代码
May 24 Javascript
Bootstrap模态对话框用法简单示例
Aug 31 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
Sep 23 Javascript
ES6 Object.assign()的用法及其使用
Jan 18 Javascript
Node.js API详解之 tty功能与用法实例分析
Apr 27 Javascript
js 自带的 map() 方法全面了解
Aug 16 #Javascript
JavaScript实战之带收放动画效果的导航菜单
Aug 16 #Javascript
js 自带的sort() 方法全面了解
Aug 16 #Javascript
JavaScript实战之菜单特效
Aug 16 #Javascript
深入理解js generator数据类型
Aug 16 #Javascript
js 创建对象 经典模式全面了解
Aug 16 #Javascript
js 上传文件预览的简单实例
Aug 16 #Javascript
You might like
PHP 一个比较完善的简单文件上传
2010/03/25 PHP
php上传apk后自动提取apk包信息的使用(示例下载)
2013/04/26 PHP
php引用传值实例详解学习
2013/11/06 PHP
PHP SOCKET编程详解
2015/05/22 PHP
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
javascript 判断整数方法分享
2014/12/16 Javascript
最新最热最实用的15个jQuery插件汇总
2015/07/05 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
2016/09/20 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
JavaScript指定断点操作实例教程
2018/09/18 Javascript
JavaScript原生数组函数实例汇总
2020/10/14 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
Python 26进制计算实现方法
2015/05/28 Python
深入理解Python中命名空间的查找规则LEGB
2015/08/06 Python
浅析python中的分片与截断序列
2016/08/09 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
Python编程求解二叉树中和为某一值的路径代码示例
2018/01/04 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
Django网络框架之创建虚拟开发环境操作示例
2019/06/06 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
python 批量修改 labelImg 生成的xml文件的方法
2019/09/09 Python
Python Flask框架实现简单加法工具过程解析
2020/06/03 Python
Python爬虫与反爬虫大战
2020/07/30 Python
详解python3类型注释annotations实用案例
2021/01/20 Python
中国医药集团国药在线:国药网
2017/02/06 全球购物
东方红海科技面试题软件测试方面
2012/02/08 面试题
服装行业创业计划书范文
2014/02/05 职场文书
人口与计划生育目标管理责任书
2014/07/29 职场文书
业务员工作态度散漫检讨书
2014/11/02 职场文书
大班下学期个人总结
2015/02/13 职场文书
2016年八一建军节活动总结
2016/04/05 职场文书
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python
mysql如何能有效防止删库跑路
2021/10/05 MySQL