2-9 get与eq的区别
本节编程练习不计算学习进度,请电脑登录imooc.com操作

get与eq的区别

.eq()  减少匹配元素的集合,根据index索引值,精确指定索引对象。
.get() 通过检索匹配jQuery对象得到对应的DOM元素。

同样是返回元素,那么eq与get有什么区别呢?

eq返回的是一个jQuery对象,get返回的是一个DOM对象。举个例子:

$( "li" ).get( 0 ).css("color", "red"); //错误
$( "li" ).eq( 0 ).css("color", "red"); //正确

get方法本质上是把jQuery对象转换成DOM对象,但是css属于jQuery构造器的,DOM是不存在这个方法的,如果需要用jQuery的方法,我们必须这样写:

var li = $( "li" ).get( 0 );
$( li ).css("color", "red"); //用$包装

取出DOM对象li,然后用$再次包装,使之转变成jQuery对象,才能调用css方法,这样要分2步写太麻烦了,所以jQuery给我们提供了一个便捷方法eq()。

eq()的实现原理就是在上面代码中的把eq方法内部转成jQuery对象:

eq: function( i ) {
    var len = this.length,
        j = +i + ( i < 0 ? len : 0 );
    return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );

上面实现代码的逻辑就是跟get是一样的,区别就是通过了pushStack产生了一个新的jQuery对象。

jQuery的考虑很周到,通过eq方法只能产生一个新的对象,但是如果需要的是一个合集对象要怎么处理?因此jQuery便提供了一个slice方法:

语法:

.slice( start [, end ] )

作用:

根据指定的下标范围,过滤匹配的元素集合,并生成一个新的 jQuery 对象。

因为是数组对象,意味着我们可以用silce来直接取值了,所以针对合集对象我们可以这样写代码:

var arr = []
arr.push( this.slice(start[,end]) )     
this.pushStack(arr)

这个this指的是jQuery对象,因为jQuery对象是数组集合,所以我们可以通过原生的silce方法直接取到集合数,然后通过包装处理即可了。

slice: function() {
    return this.pushStack( slice.apply( this, arguments ) );
},

任务

  1. <!DOCTYPE HTML>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5. <script src="http://img1.sycdn.imooc.com//down/540812440001e40e00000000.js" type="text/javascript"></script>
  6. <title></title>
  7. </head>
  8. <body>
  9.  
  10.  
  11. <table border="1">
  12. <tr><td>TD #0</td><td>TD #1</td><td>TD #2</td></tr>
  13. <tr><td>TD #3</td><td>TD #4</td><td>TD #5</td></tr>
  14. <tr><td>TD #6</td><td>TD #7</td><td>TD #8</td></tr>
  15. </table>
  16.  
  17. <ul>
  18. <li>list item 1</li>
  19. <li>list item 2</li>
  20. <li>list item 3</li>
  21. <li>list item 4</li>
  22. <li>list item 5</li>
  23. </ul>
  24.  
  25.  
  26. <script type="text/javascript">
  27.  
  28. $("td:eq(2)").css("color", "red")
  29.  
  30.  
  31. $('li').eq(2).css('background-color', 'red');
  32. $('li').eq(-2).css('background-color', 'red');
  33.  
  34. </script>
  35. </body>
  36. </html>
下一节