经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » jQuery » 查看文章
jQuery 源码解析(七) jQuery对象和DOM对象的互相转换
来源:cnblogs  作者:大沙漠  时间:2019/9/2 9:52:36  对本文有异议

jQuery对象是一个类数组对象,它保存的是对应的DOM的引用,我们可以直接用[]获取某个索引内的DOM节点,也可以用get方法获取某个索引内的DOM节点,还可以用toArray()方法把jQuery对象一次性转换成一个数组,例如:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script>
  7. </head>
  8. <body>
  9. <p>1</p>
  10. <p>2</p>
  11. <p>3</p>
  12. <script>
  13. var jObject = $('p');
  14. console.log(jObject[0].innerHTML) //输出:1
  15. console.log(jObject[1].innerHTML) //输出:2
  16. console.log(jObject.get(2).innerHTML) //输出:3
  17. console.log(jObject.toArray()) //输出:Array(3) [ p, p, p ] ;每个元素都是一个DOM节点,等于对应的p元素
  18. </script>
  19. </body>
  20. </html>

将DOM对象转换为jQuery对象就更方便了,直接放到jQuery的构造器内即可,如下:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Document</title>
  6. <script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script>
  7. </head>
  8. <body>
  9. <p>1</p>
  10. <p>2</p>
  11. <p>3</p>
  12. <script>
  13. var p = document.getElementsByTagName('p'),
  14. result = [];
  15. for(let i = 0;i<p.length;i++) result.push(i) //getElementsByTagName获取的是HTMLCollection对象,也是个类数组,我们把它转换为数组格式
  16. console.log( $(p) instanceof $ ) //输出true ;表示$(p)是一个jQuery对象
  17. console.log( $(p).size() ) //输出:3 ;因为p内有3个DOM元素
  18. console.log( $(p[0]) instanceof $ ) //输出true ;表示$(p)是一个jQuery对象
  19. console.log( $(p[0]).size() ) //输出:1 ;因为我们只传入一个p[0],只有一个DOM节点
  20. </script>
  21. </body>
  22. </html>

输出如下:

原因在代码里注释得挺详细了,嗯,就这样

 

源码分析

writer by:大沙漠 QQ:22969969


 DOM转换成jQuery对象都是在jQuery内部的init()函数内实现的,如下:

  1. init: function( selector, context, rootjQuery ) {
  2. /**/
  3. // Handle $(DOMElement)
  4. if ( selector.nodeType ) { //selector有属性nodeType,则认为selector是DOM元素,例如:$(document.getELementById('d'))
  5. this.context = this[0] = selector; //保存该DOM节点的引用
  6. this.length = 1; //设置length属性为1
  7. return this; //返回this,以支持链式操作
  8. }
  9. /**/
  10.  
  11. return jQuery.makeArray( selector, this ); //这里是最后的逻辑,如果selector是数组或伪数组
  12. },

makeArray是jQuery内部的一个函数,用于把一个类数组转换成真正的数据,如下:

  1. makeArray: function( array, results ) { //将一个类数组对象转换为真正的数组
  2. var ret = results || []; //如果results不存在则修正为空数组,初始化jQuery执行到这里时这里的result等于jQuery对象,也就是上面传进来的this
  3.  
  4. if ( array != null ) { //过滤参数array是null、undefined的情况。
  5. // The window, strings (and functions) also have 'length'
  6. // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
  7. var type = jQuery.type( array );
  8. if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { //如果array没有属性length 或者 参数array是字符串,或者是函数,或者是正则,或者是Window对象
  9. push.call( ret, array ); //认为参数array不是数组,也不是类数组对象,调用数组方法push()把该参数插入返回值ret的末尾。
  10. } else {
  11. jQuery.merge( ret, array ); //否则认为参数array是数组或类数组对象,调用方法jQuery.merge()把该参数合并到返回值ret中
  12. }
  13. }
  14. return ret;
  15. },

最后返回该数组,因为我们在第二个参数传递了this,因此makeArray最后会返回this

对于jQuery对象转换为DOM对象来说,由于jQuery本身就是个类数组对象,因此,我们可以直接用[]获取索引,对于get和toArray方法来说,这些操作定义在jQuery的原型上,也就是jQuery.fn上的,如下:

  1. jQuery.fn = jQuery.prototype = { //重写jQueyr.fn
  2. /**/
  3. toArray: function() { //将当前jQuery对象转换为真正的数组,转换后的数组包含了所有元素。
  4. return slice.call( this, 0 );
  5. },
  6. get: function( num ) { //返回当前jQuery 对象中指定位置的元素或包含了全部元素的数组,
  7. return num == null ?
  8.  
  9. // Return a 'clean' array
  10. this.toArray() :
  11. // Return just the object
  12. ( num < 0 ? this[ this.length + num ] : this[ num ] ); //直接返回this[num],也就是和我们用[]是一样的,只是封装了一下
  13. },
  14. /**/
  15. }

我们可以看到对于get来说,就是直接从this[]上获取的,而toArray则调用了数组了slice方法,将类数组转换成真实的数组

原文链接:http://www.cnblogs.com/greatdesert/p/11428986.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号