我现在正在重构一些代码,并遇到了一个选择器:
jQuery("tr","#ctl00_MainContent_MyUserControl").each(function(i,row) { ... }
看起来它正在从页面上的用户控件中选择<tr>
(忽略实例完全命名的事实!)但它不是我熟悉的语法,也找不到任何东西在文档中。我希望它写成:
$("#ctl00_MainContent_MyUserControl tr").each(function(i,row) { ... }
有谁可以告诉我,如果我在这里缺少(微妙或其他)差异?
答案 0 :(得分:16)
This selector选择ID为tr
的元素内的所有ctl00_MainContent_MyUserControl
元素。它与你的第二个例子完全相同。
第二个参数提供第一个参数的上下文。此语法有更好的用例,例如:
function(el) {
$('tr', el).each(...);
}
el
是您网页上的某个元素。在这种情况下,您不能使用第二种语法形式。
答案 1 :(得分:14)
使用两个参数(selector
和context
)jQuery()
jQuery(context).find(selector)
调用is equivalent to方法。因此:
jQuery("tr","#ctl00_MainContent_MyUserControl");
等于:
jQuery("#ctl00_MainContent_MyUserControl").find("tr");
也恰好与以下相同:
jQuery("#ctl00_MainContent_MyUserControl tr");
我的个人意见是 context
的使用只有在您可以传递已经选定的元素(jQuery
或DOM
)时才有意义,不是这样你刚刚传递了一个选择器(String
)。在这种情况下,我只是喜欢模仿CSS选择器:例如,#ctl00_MainContent_MyUserControl tr
。
答案 2 :(得分:3)
它完全一样。它也可以写成:
$("#ctl00_MainContent_MyUserControl").find("tr").each(function(i,row) { ... }
前者的语法可以在jQuery constructor documentation中看到。它基本上是“找到与第一个选择器匹配的所有元素,这是第二个匹配的第二个的后代”。
答案 3 :(得分:2)
jQuery构造函数的第二个参数(当第一个是选择器时)是 context 。
来自API文档
context 要用作上下文的DOM元素,文档或jQuery