$("1.1确定包装集的大小 jQuery元素包装集运行起来与数组非常相似:像javascript数组那样有length属性。还有jQuery定义的size()方法。 1.2从包装集获取元素 jQuery运行把包装集当做数组进行处理,因此从包装集中获取元素可以利用数组下标的方式,也可以利用get()方法来获取。get() 方法也可以把元素包装集转化为普通的javascript数组。例如: var numv = $("#id").get(); 如果包装集的元素过多,想要获取某个元素,最好的方法就是通过下标去取,jQuery也提供了获取下标的方法index(element)。例如: var n = $('img').index($('img#findMe')[0]); 参数element是元素的引用。index是在包装集或查找传入的元素,如果有就返回该元素在包装集中的下标,没有就返回-1。 1.3筛选元素包装集 拥有元素包装集之后,可能需要添加元素扩大集合,也可能把原始匹配的包装集缩小为它的子集。 1.3.1添加更多的元素到包装集 我们经常需要添加更多的元素到现有的包装集。某个命令应用到原始包装集之后,想要添加更多的元素时,这种能力更为重要。假定想要匹配带有alt或者title特性的所有<img>元素,jQuery选择器运行在当个选择器中实现这个功能,例如: $('img[alt],img[title]') 但是为了说明add()方法的操作过程,采用如下语句匹配相同的元素集合: $('img[alt]').add('img[title]') 以这种方式来调用add()方法,允许把多个选择器链在一起形成“或”关系。因此,示例代码创建两个包装集的并集,每个包装集分别由各自的选择器匹配得来。想add() 这样的方法,也可以用于代替选择器。end()方法可用于删除通过add()方法所添加的元素。 如果传入元素的引用,add()方法也可以用于添加元素到现有包装集。只要把一个元素引用或元素引用的数组传递给add()方法,就可以添加元素到包装集。假的有一个元素引用,命名为someElement,则可以把原始添加到带有alt属性的所有图像集中: $('img[alt]').add(someElement) add()方法不仅允许把现有元素添加到包装集,还能够通过传入包含HTML元素的字符串来添加新元素,例如: $('p').add('<div>Hi there</div>') 这个语句首先创建文档里所有<p>元素的包装集,然后新建一个<div>元素并添加到包装集。需要注意的是,这样做只添加新元素到包装集,语句中并没有调用添加新元素到DOM的方法。 1.3.2 整理包装集的内容 在jQuery里调用add()方法,把多个选择器链接在一起形成“或”关系,从而创建包装集,是简单的事情。除此之外,通过调用not()方法把选择器链在一起形成“与非”关系也是可以的。这与之前讨论过的:not选择器有相似之处。然而,调用方式却与add()方法相似,即在jQuery命令链的任何一环,从包装集中删除元素。I have foo!I don't") .filter("#foo1").click( function (){ alert("I'm foo!"); }).end().appendTo("#someParentDiv");
例如,要选择页面中带有title属性的所有img元素,出title特性值包含文本puppy的元素意外。即:
img[title]:not([title*=puppy]) 通过使用not方法: $('img[title]').not('[title*=puppy]'); 值得注意的是,传递给not()方法的选择器仅限于删除任何元素引用的筛选表达式。如果错误地传递了更加显示的选择器(如:img[title*=puppy])给not方法,就无法得到预期结果。not()方法不支持原始选择器。 和add()方法一样,如果传入元素引用或元素引用的数组,not()方法也可以用于从包装集中删除个别元素。 有时候,筛选包装集的方式难以或者不可能用选择器表达式表达出来,在这种情况下,必须求助于编程方式去筛选包装集中的元素。迭代包装集的所有元素,调用not方法删除不符合标准的元素。但是jQuery团队不想让用户被迫亲自去做这一切工作,所以定义了filter()方法。 filter()方法,当传给它一个函数,它会为每个包装集元素反复调用哪个函数,如果哪个元素的函数调用返回false值,就删除那个元素,利用筛选函数体的函数上下文,(即 this)每次调用都能存取当前包装集元素。 假定处于某种理由,想要想要创建包含数字值的所有<td>元素的包装集。即使和jQuery的选择器表达式一样强大,也不可能利用选择器表达式表达上述要求。在这种情况下,filter()方法就派上用场了,如下所示: $('td').filter(function (){return this.innerHTML.match(/^\d+$/);}); 这个jQuery表达式首先创建所有的<td>元素的包装集,然后为每一个包装集元素个调用一次传递给filter()方法的函数,并且将当前包装集元素作为当次调用的this值。函数利用正则表达式确定元素内容是否匹配已描述的模式,如果不匹配这返回false。筛选函数调用返回false的任何元素,都会从包装集里删除。 例如:$('img').addClass('seeThrough').filter('title*=dog').addClass('thickBorder'); 这个命令链语句选择所有图像,并对所有图像应用seeThrough样式,然后缩小集合,只留下title特性包含文本dog的图像元素,接着对留下的元素应用另一个名为thickBorder的样式。1.3.3获取包装集的子集 有时,希望根据元素在包装集里的位置,获取包装集的子集。jQuery提供了名为slice()的方法,这个命令创建并返回来自原始包装集的任何连续部分的新包装集,或者把它较为元素包装集的切片。 slice(begin,end):创建并返回新的包装集,新包装集是原始包装集的连续的一部分。 参数begin(数字):将被包含在返回切片中的第一个元素的下标(从0开始)。 参数end(可选、数字):不被包含在返回切片中的第一个元素的下标(从0开始);或一个数字,该数字超出了原始包装集的最后一个元素的下标,如果省略,则切片延伸到原始包装集的末尾。 例如:如果想获取原始包装集的第四个元素,可用 $('*').slice(3,4); 值得注意的是,$('*').slice(3,4)与$('*').get(3)不同。前者返回的是一个包装集,后者返回的是元素。 1.3.4利用关系获取包装集 jQuery允许根据HTML DOM中包装元素与其他元素的层次关系,从现有包装集里获取新包装集。如下表:方法 | 描述 |
children() | 返回原始包装集元素的所有唯一子元素所组成的包装集。 |
contents() | 返回原始包装集元素的内容的包装集,这些元素可能包含文本节点(经常用于获取<iframe>元素的内容)。 |
next() | 返回原始包装集元素的所有唯一的下一个兄弟元素所组成的包装集。 |
nextAll() | 返回包含原始包装集元素的所有后续兄弟元素的包装集。 |
parent() | 返回原始包装集所有元素的唯一直接父元素所组成的包装集。 |
parents() | 返回原始包装集所有元素的唯一祖先元素所组成的包装集,包括直接父元素和一直向上追溯的祖先元素,但不包括文档根元素。 |
prev() | 返回原始包装集元素的所有唯一的上一个兄弟元素所组成的包装集。 |
prevAll() | 返回包含原始包装集元素的所有前面兄弟元素的包装集。 |
siblings() | 返回原始包装集元素的所有唯一兄弟元素所组成的包装集。 |