2011-11-11 126 views
18

我此刻重构了一些代码和所遇到的一个选择:逗号分隔的选择器列表?

jQuery("tr","#ctl00_MainContent_MyUserControl").each(function(i,row) { ... } 

它看起来像它的选择在页面上从用户控制<tr>的(忽略的事实情况完全命名!)但它不是我熟悉的语法,在文档中找不到任何内容。我希望它写成:

$("#ctl00_MainContent_MyUserControl tr").each(function(i,row) { ... } 

谁能告诉我,如果有区别(细微的或以其他方式),我很想念这里?

+0

第一种语法对于上下文被缓存并且您想对其执行快速查询时非常有用。然而正如其中一个答案所提到的,它对于$('#...').find('tr')来说是等价的。如果缓存不重要,则为了便于阅读,推荐使用第二种语法。请记住,当你缓存某些东西时,它会占用内存,所以有时候开销并不值得。 – AlexStack

回答

16

This selector选择编号为ctl00_MainContent_MyUserControl的元素中的所有tr元素。这与你的第二个例子完全一样。

第二个参数为第一个参数提供了一个上下文。还有更好的用例这样的语法,例如:

function(el) { 
    $('tr', el).each(...); 
} 

哪里el是您的网页上的某些元素。在这种情况下,你不能使用第二种语法形式。

+0

这与使用'$(el).find('tr')'相同吗?如果是这样,哪一个更高效的想法? – ksav

2

jQuery构造函数的第二个参数(当第一个是选择器时)是上下文

从API文档

方面 DOM元素,文档或jQuery的使用作为背景

http://api.jquery.com/jQuery/

3

这是完全一样的。它也可以写成:

$("#ctl00_MainContent_MyUserControl").find("tr").each(function(i,row) { ... } 

前者的语法可以在jQuery constructor documentation中看到。它基本上是“找到所有匹配第一个选择器的元素,这是第二个匹配的第二个后裔”。

12

使用两个参数调用jQuery()方法(selectorcontextis equivalent tojQuery(context).find(selector)。因此:

jQuery("tr","#ctl00_MainContent_MyUserControl"); 

等于:

jQuery("#ctl00_MainContent_MyUserControl").find("tr"); 

这也恰好是相同的:

jQuery("#ctl00_MainContent_MyUserControl tr"); 

我个人的看法是,使用context只当您可以通过已选择的元素时有意义jQueryDOM),而不是仅仅通过选择器(String)。在这种情况下,我只是更喜欢模仿CSS选择器:例如,#ctl00_MainContent_MyUserControl tr