1 http://www.365mini.com/page/jquery-append.htm

2 http://blog.csdn.net/chaiyining007/article/details/8213699

jq1.7.1这个版本为例。

首先我们来看下jq api的说明:向每个匹配的元素内部追加内容。

这个操作与对指定的元素执行appendChild方法,将它们添加到文档中的情况类似。

这个方法接收1个参数:content,接受类型有4种(3种从1.0就有了,function从1.4之后开始有)

String:字符串,这个容易理解就是可以直接$("选择器").append("aaaabbbbbcccc");这么写,当然jq内部还支持$("选择器").append('<a href="#"></a>');这种html标签的字符串,至于性能方面咋们后面看源码的时候在细论。

Element:节点,这个也容易理解就是dom节点么基本上俺是写成,$("选择器").append(document.getElementsByTagName("a"))这类,不过这么写的同学要注意一点,这么写会将原来位置的dom给“剪切”到选择器底部,请允许我这么形容。

jQuery:jQuery对象,这注意这个对象是jq选择器加工过的对象,比如$("选择器1").append($(“选择器2”));而不是$("选择器1").append($);写到这俺笑了,应该没人写append($)这个是吧。

function(index, html):一个function对象(参数后面讲),可以写成$("选择器").append(function(index,html){return ""});其中return "" 可以省略,任何函数都有返回值,没写return就会返回undefined,这个貌似高程或者权威指南有讲,具体哪写的,俺也忘记了。index参数为对象在这个集合中的索引值,要解释这句话,我们看个例子吧

  1. var _body=$("body");
  2. _body.html('');//清空body
  3. _body.append("<div></div><div></div>");//插入2个空div
  4. $("div").append(function(){return "a"});//我们要用结果猜个答案,虽然不是必须用这个例子,不过反正到这了 就这么写了

看到结果,俺猜append方法内部对整个选择器进行了遍历,然后插入了函数返回的东西。

所以index和html很容易理解了,就是在便利过程中的index和index对应的原先的html(插入之前);

最后讲一下,就是jq本身就是链式调用,所以append()返回的是选择器选择的对象被插之后的新对象,讲的好邪恶。

可以$("选择器").append().append().append().......................,不过一般都不会这么玩吧?

解释完API我们来看看源码

看到这个截图...好吧我们继续往下看。

  1. domManip: function (args, table, callback) {
  2. //定义6个变量,我们先不管这些变量干嘛。
  3. var results, first, fragment, parent,
  4. value = args[0],/*args参数在append调用的时候其实只有1个参数*/
  5. scripts = [];
  6. /*
  7. 进行了各种判断
  8. 1、!jQuery.support.checkClone:确保文档碎片还没有被克隆(作用在后面)
  9. 2、arguments.length === 3,确保调用domManip这个函数只有3个参数,否则会往后面走,这个很妙
  10. 3、typeof value === "string"确认你的参数是string类型
  11. 4、rchecked.test(value)
  12. */
  13. if (!jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test(value)) {
  14. //遍历选择器,看来我前面的猜测对了
  15. return this.each(function () {
  16. //看每次循环都调用了这个domManip,但是这些调用不会进入这个if,为什么?仔细看上面的注释与下面的调用
  17. jQuery(this).domManip(args, table, callback, true);
  18. });
  19. }
  20. //如果参数类型是function的
  21. if (jQuery.isFunction(value)) {
  22. //还是遍历
  23. return this.each(function (i) {
  24. var self = jQuery(this);
  25. /*
  26. 记得function的返回值吗?这边就把那边的返回值存到args[0]里面了
  27. table ? self.html() : undefined;这句话看不懂?table这个变量,在append调用domManip时已经写死了是true
  28. 所以在执行function类型参数的时候那个index和html是什么这边已经很明显了
  29. */
  30. args[0] = value.call(this, i, table ? self.html() : undefined);
  31. //取到插入的内容之后,重复第一步......
  32. self.domManip(args, table, callback);
  33. });
  34. }
  35. /*
  36. 到了这里,已经确保你取到了function中返回的string
  37. 上面的各种判断已经把你参数处理成接下去想要的,淡定的往下看吧
  38. if (this[0]) 这个判断。。。确保选择器存在,为什么不放最前面?
  39. */
  40. if (this[0]) {
  41. /*
  42. 取父级节点
  43. &&运算符就是
  44. 0&&1=0
  45. 1&&2=2
  46. 0&&0=0
  47. */
  48. parent = value && value.parentNode;
  49. // If we're in a fragment, just use that instead of building a new one
  50. /*
  51. 如果已经有元素碎片了就用原来的,不然就新建一个
  52. */
  53. if (jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length) {
  54. results = { fragment: parent };
  55. } else {
  56. results = jQuery.buildFragment(args, this, scripts);
  57. }
  58. fragment = results.fragment;
  59. //取碎片中最后一个
  60. if (fragment.childNodes.length === 1) {
  61. first = fragment = fragment.firstChild;
  62. } else {
  63. first = fragment.firstChild;
  64. }
  65. //存在最后一个节点
  66. if (first) {
  67. //确保最后一个元素是tr?
  68. table = table && jQuery.nodeName(first, "tr");
  69. for (var i = 0, l = this.length, lastIndex = l - 1; i < l; i++) {
  70. callback.call(
  71. table ?
  72. root(this[i], first) :
  73. this[i],
  74. // Make sure that we do not leak memory by inadvertently discarding
  75. // the original fragment (which might have attached data) instead of
  76. // using it; in addition, use the original fragment object for the last
  77. // item instead of first because it can end up being emptied incorrectly
  78. // in certain situations (Bug #8070).
  79. // Fragments from the fragment cache must always be cloned and never used
  80. // in place.
  81. results.cacheable || (l > 1 && i < lastIndex) ?
  82. jQuery.clone(fragment, true, true) :
  83. fragment
  84. );
  85. }
  86. }
  87. /*插入脚本文件的话jq会帮你去请求的*/
  88. if (scripts.length) {
  89. jQuery.each(scripts, function (i, elem) {
  90. if (elem.src) {
  91. jQuery.ajax({
  92. type: "GET",
  93. global: false,
  94. url: elem.src,
  95. async: false,
  96. dataType: "script"
  97. });
  98. } else {
  99. jQuery.globalEval((elem.text || elem.textContent || elem.innerHTML || "").replace(rcleanScript, "/*$0*/"));
  100. }
  101. if (elem.parentNode) {
  102. elem.parentNode.removeChild(elem);
  103. }
  104. });
  105. }
  106. }
  107. return this;
  108. }

在往里面还有个底层buildFragment方法,我稍微看了,解释起来颇为费劲。

jquery append()详解的更多相关文章

  1. jQuery.validator 详解二

    前言:上一篇详细的介绍了jQuery.validator( 版本v1.13.0 )的验证规则,这一篇重点讲述它的源码结构,及如何来对元素进行验证,错误消息提示的内部实现 一.插件结构(组织方式) 在讲 ...

  2. jQuery.validator 详解

    jQuery.validator 详解二 前言:上一篇详细的介绍了jQuery.validator( 版本v1.13.0 )的验证规则,这一篇重点讲述它的源码结构,及如何来对元素进行验证,错误消息提示 ...

  3. jQuery:详解jQuery中的事件(二)

    上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件.事件冒泡和事件移除等内容. 接上篇jQuery:详解jQuery中的事件(一) ...

  4. jquery方法详解

    jquery方法详解 http://www.365mini.com/doc

  5. Jquery 选择器 详解 js 判断字符串是否包含另外一个字符串

    Jquery 选择器 详解   在线文档地址:http://tool.oschina.net/apidocs/apidoc?api=jquery 各种在线工具地址:http://www.ostools ...

  6. [转载]JavaEE学习篇之——JQuery技术详解

    原文链接:http://blog.csdn.net/jiangwei0910410003/article/details/32102187 1.简介2.工具3.jQuery对象 1.DOM对象转化成j ...

  7. J2EE学习篇之--JQuery技术详解

    前面我们讲解了的J2EE的技术都是服务端的技术,下面我们来看一下前端的一些开发技术,这一篇我们来看一下jQuery技术 简介: jQuery由美国人John Resig创建,至今已吸引了来自世界各地的 ...

  8. JQuery数组详解(含实例)

    <!doctype html>jQuery数组处理详解(含实例演示)@Mr.Think 演示所用数组 var _mozi=['墨家','墨子','墨翟','兼爱非攻','尚同尚贤']; 1 ...

  9. jquery扩展函数详解(我的人生颠覆)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上次分析了jquery的源码 ...

随机推荐

  1. DELPHI出现无法加载dclite50.bpl的解决办法(转)

    现象: Borland Integrated Translation Environment 加载出错 解决办法: 我的电脑--->(鼠标右键)属性--->高级--->(性能)设置- ...

  2. Java常见编码方式简介

    计算机只能识别二进制数据,早期由来是电信号. 为了方便应用计算机,让它可以识别各个国家的文字. 就将各个国家的文字用数字来表示,并一一对应,形成一张表. ASCII:美国标准信息交换码. 用一个字节的 ...

  3. export

    export export PATH=$PATH:/ROOT

  4. Python学习总结:目录

    Python 3.x总结 Python学习总结[第一篇]:Python简介及入门 Python学习总结[第二篇]:Python数据结构 Python学习总结[第三篇]:Python之函数(自定义函数. ...

  5. yii2 批量插入or更新

    $sql1 = 'insert into business_ip (gid, name, area, belongName, belongArea, destIPv4, created, update ...

  6. Python模块学习

    6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...

  7. JAVA基础知识之IO——IO流(Stream)的概念

    Java IO 流 Java将不同的设备或载体(键盘.文件.网络.管道等)的输入输出数据统称为"流"(Stream),即JAVA的IO都是基于流的. JAVA传统的所有流类型类都包 ...

  8. Sublime Text shift+ctrl妙用、Sublime Text快捷组合键大全

    Package Control 安装方法 首先通过快捷键 ctrl+` 或者 View > Show Console 打开控制台,然后粘贴相应的 Python 安装代码. 1 :按住shift+ ...

  9. 用python requests库写一个人人网相册爬虫

    担心人人网会黄掉,写个爬虫,把我的相册照片都下载下来.代码如下: # -*- coding: utf-8 -*- import requests import json import os def m ...

  10. Mac OS下应用Python+Selenium实现web自动化测试

    在Mac环境下的自动化测试环境搭建这里有一篇亲测通过的文<mac下怎么搭建selenium python环境?>. 不过在这个过程中要注意两点: 1.在终端联网执行命令“sudo pip ...