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 相关文章推荐
实现连缀调用的map方法(prototype)
Aug 05 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
原生js的弹出层且其内的窗口居中
May 14 Javascript
使用javascript实现雪花飘落的效果
Jan 13 Javascript
jQuery插件Elastislide实现响应式的焦点图无缝滚动切换特效
Apr 12 Javascript
js弹出对话框方式小结
Nov 17 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
Jan 22 Javascript
jQuery实现下拉框左右移动(全部移动,已选移动)
Apr 15 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
Sep 04 Javascript
微信小程序模板之分页滑动栏
Feb 10 Javascript
详解Vue 实例中的生命周期钩子
Mar 21 Javascript
如何制作自己的原生JavaScript路由
May 05 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操作文件方法问答
2007/03/16 PHP
PHP实现阿里大鱼短信验证的实例代码
2017/07/10 PHP
PHP的mysqli_stat()函数讲解
2019/01/23 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
Ajax::prototype 源码解读
2007/01/22 Javascript
jquery.boxy插件的iframe扩展代码
2010/07/02 Javascript
网页防止tab键的使用快速解决方法
2013/11/07 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
JavaScript中的Promise使用详解
2015/06/24 Javascript
50 个 jQuery 插件可将你的网站带到另外一个高度
2016/04/26 Javascript
jQuery简单实现iframe的高度根据页面内容自适应的方法
2016/08/01 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
微信小程序 Template详解及简单实例
2017/01/05 Javascript
Node.js 中exports 和 module.exports 的区别
2017/03/14 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
JavaScript中的this基本问题实例小结
2020/03/09 Javascript
JavaScript如何使用插值实现图像渐变
2020/06/28 Javascript
解决Vue中使用keepAlive不缓存问题
2020/08/04 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
[00:34]DOTA2上海特级锦标赛 VG战队宣传片
2016/03/04 DOTA
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
python使用udp实现聊天器功能
2018/12/10 Python
python实现串口通信的示例代码
2020/02/10 Python
详解Python中第三方库Faker
2020/09/25 Python
GUESS盖尔斯法国官网:美国时尚品牌
2016/09/23 全球购物
复古斯堪的纳维亚儿童服装:Baby go Retro
2017/09/09 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
CAD制图人员的自荐信
2014/02/07 职场文书
大宝sod蜜广告词
2014/03/21 职场文书
推广活动策划方案
2014/08/23 职场文书
灵魂歌王观后感
2015/06/17 职场文书
解决Jupyter-notebook不弹出默认浏览器的问题
2021/03/30 Python
基于HTML十秒做出淘宝页面
2021/10/24 HTML / CSS