深入理解jQuery3.0的domManip函数


Posted in Javascript onSeptember 01, 2016

domManip 这个函数的历史由来已久,从 jQuery 1.0 版本开始便存在了,一直到最新的 jQuery 版本。可谓是元老级工具函数。

domManip 的主要功能是为了实现 DOM 的插入和替换。具体共为以下 5 个函数服务

•内部后插入(append)

•内部前插入(prepend)

•外部前插入(before)

•外部后插入(after)

•替换元素 (replaceWith,1.9.x 之前的版本没有使用 domMainp)

而一个 each 就生成了另外 5 个函数:appendTo、prependTo、insertBefore、insertAfter、replaceAll

jQuery.each( {
  appendTo: "append",
  prependTo: "prepend",
  insertBefore: "before",
  insertAfter: "after",
  replaceAll: "replaceWith"
}, function( name, original ) {
  jQuery.fn[ name ] = function( selector ) {
    var elems,
      ret = [],
      insert = jQuery( selector ),
      last = insert.length - 1,
      i = 0;
    for ( ; i <= last; i++ ) {
      elems = i === last ? this : this.clone( true );
      jQuery( insert[ i ] )[ original ]( elems );
      // Support: Android <=4.0 only, PhantomJS 1 only
      // .get() because push.apply(_, arraylike) throws on ancient WebKit
      push.apply( ret, elems.get() );
    }
    return this.pushStack( ret );
  };
} );

如图

深入理解jQuery3.0的domManip函数

内部调用如图

深入理解jQuery3.0的domManip函数

源码

append: function() {
  return domManip( this, arguments, function( elem ) {
    if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
      var target = manipulationTarget( this, elem );
      target.appendChild( elem );
    }
  } );
},
prepend: function() {
  return domManip( this, arguments, function( elem ) {
    if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
      var target = manipulationTarget( this, elem );
      target.insertBefore( elem, target.firstChild );
    }
  } );
},
before: function() {
  return domManip( this, arguments, function( elem ) {
    if ( this.parentNode ) {
      this.parentNode.insertBefore( elem, this );
    }
  } );
},
after: function() {
  return domManip( this, arguments, function( elem ) {
    if ( this.parentNode ) {
      this.parentNode.insertBefore( elem, this.nextSibling );
    }
  } );
},
replaceWith: function() {
  var ignored = [];
  // Make the changes, replacing each non-ignored context element with the new content
  return domManip( this, arguments, function( elem ) {
    var parent = this.parentNode;
    if ( jQuery.inArray( this, ignored ) < 0 ) {
      jQuery.cleanData( getAll( this ) );
      if ( parent ) {
        parent.replaceChild( elem, this );
      }
    }
  // Force callback invocation
  }, ignored );
}

domManip 的实现

domManip 的主要功能就是添加 DOM 元素,因为添加的位置不同而提供了四个公开函数 append、prepend、before、after,此外还有一个 replaceWith。简单说 domManip 就做了两件事

1.先完成 DOM 节点添加

2.如果添加的 DOM 节点内有 script 标签,需要额外处理下。对于可执行的 script (通过type属性判断)则执行其内的脚本代码,其它的则不执行。

domManip 依赖的一个重要函数就是 buildFragment,为 DOM 插入提高了性能。

domManip 内对 script 节点元素做了特殊处理

1.script 无 type 属性,默认会执行其内的 JS 脚本

2.script 的 type="text/javascript" 或 type="text/ecmascript" ,会执行其内的 JS 脚本

3.script 如果有 src 属性,会执行 $._evalUrl 请求远程的 JS 文件并执行

4.其它不会执行 JS 脚本,有时我们会用 script 来做 html 模板,如 underscore.js,type="text/template" 或 type="text/plain" 这种,其内的 JS 都不会被执行

此外 dataPriv.access( node, "globalEval" ),这一句标示了如果该 script 已经执行过,则不会再次执行。或者说执行后会设置一个 globalEval: true 的标示。

domManip 内部依赖 buildFragment、restoreScript、disableScript、jQuery._evalUrl、DOMEval 这几个小函数,而 restoreScript、jQuery._evalUrl 也仅在 domManip 用到。

// Replace/restore the type attribute of script elements for safe DOM manipulation
function disableScript( elem ) {
  elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
  return elem;
}
function restoreScript( elem ) {
  var match = rscriptTypeMasked.exec( elem.type );
  if ( match ) {
    elem.type = match[ 1 ];
  } else {
    elem.removeAttribute( "type" );
  }
  return elem;
}
jQuery._evalUrl = function( url ) {
  return jQuery.ajax( {
    url: url,
    // Make this explicit, since user can override this through ajaxSetup (#11264)
    type: "GET",
    dataType: "script",
    cache: true,
    async: false,
    global: false,
    "throws": true
  } );
};

domManip 经历了各个版本的演变

1.

3.0.x 之前版本的 domManip 函数是挂在 jQuery 对象上面的(jQuery.fn.domManip),即通过 $().domManip 方式可以访问;3.0.x 后 domManip 是一个私有函数,外部无法访问

2.

1.2.x 之前 domManip 有 4 个参数;1.3.x ~ 1.9.x 是 3 个参数;2.x 只有 2 个参数;3.x 有 4 个参数

3.

1.9.x 之前的版本 replaceWith 没有使用 domMainp

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

Javascript 相关文章推荐
获取dom元素那些讨厌的位置封装代码
Jun 23 Javascript
jquery实现图片裁剪思路及实现
Aug 16 Javascript
jQuery中last()方法用法实例
Jan 06 Javascript
FullCalendar日历插件应用之数据展现(一)
Dec 23 Javascript
js实现PC端根据IP定位当前城市地理位置
Feb 22 Javascript
JavaScript实现弹出广告功能
Mar 30 Javascript
JS异步函数队列功能实例分析
Nov 28 Javascript
原生JavaScript实现todolist功能
Mar 02 Javascript
详解在React.js中使用PureComponent的重要性和使用方式
Jul 10 Javascript
如何实现一个webpack模块解析器
Oct 24 Javascript
JS求1到任意数之间的所有质数的方法详解
May 20 Javascript
微信小程序的注册页面包含倒计时验证码、获取用户信息
May 22 Javascript
总结AngularJS开发者最常犯的十个错误
Aug 31 #Javascript
ES6记录异步函数的执行时间详解
Aug 31 #Javascript
基于angularjs实现图片放大镜效果
Aug 31 #Javascript
用AngularJS的指令实现tabs切换效果
Aug 31 #Javascript
简洁实用的BootStrap jQuery手风琴插件
Aug 31 #Javascript
AngularJS实现一次监听多个值发生的变化
Aug 31 #Javascript
利用Angularjs和bootstrap实现购物车功能
Aug 31 #Javascript
You might like
浅谈PHP错误类型及屏蔽方法
2017/05/27 PHP
php实现简单四则运算器
2020/11/29 PHP
一个级联菜单代码学习及removeClass与addClass的应用
2013/01/24 Javascript
一个字符串反转函数可实现字符串倒序
2014/09/15 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
Javascript编程中几种继承方式比较分析
2015/11/28 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
详解在express站点中使用ejs模板引擎
2017/09/21 Javascript
基于Vue渲染与插件的加载顺序的问题详解
2018/03/05 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
2018/12/03 Javascript
详解javascript中的Error对象
2019/04/25 Javascript
js 根据对象数组中的属性进行排序实现代码
2019/09/12 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
Python实现二分法算法实例
2015/02/02 Python
Python利用IPython提高开发效率
2016/08/10 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
2018/03/13 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
用python写测试数据文件过程解析
2019/09/25 Python
Python编程快速上手——正则表达式查找功能案例分析
2020/02/28 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
Pycharm 设置默认解释器路径和编码格式的操作
2021/02/05 Python
外贸销售员求职的自我评价
2013/11/23 职场文书
给酒店员工的表扬信
2014/01/11 职场文书
开展批评与自我批评发言材料
2014/10/17 职场文书
晚会开幕词
2015/01/28 职场文书
投标单位介绍信
2015/05/05 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python
SQL Server中使用表变量和临时表
2022/05/20 SQL Server