Javascript 每个vs智能选择器

Javascript 每个vs智能选择器,javascript,jquery,Javascript,Jquery,使用哪一个更好,每个功能都可以自己使用,或者使用一些智能选择器来做同样的事情 例如: 每个功能 $('nav#mainNav > ul > li > ul').each(function(){ $(this).closest('li').addClass('hasSub'); }); 选择器 var addClass = $('nav#mainNav > ul > li > ul').closest('li').addClass('hasSub');

使用哪一个更好,每个功能都可以自己使用,或者使用一些智能选择器来做同样的事情

例如:

每个功能

$('nav#mainNav > ul > li > ul').each(function(){
   $(this).closest('li').addClass('hasSub'); 
});
选择器

var addClass = $('nav#mainNav > ul > li > ul').closest('li').addClass('hasSub');
这两种方法的作用是一样的,但是用一种方法代替另一种方法有什么意义吗

这两种方法的作用是一样的,但是用一种方法代替另一种方法有什么意义吗

对。第二个方法更短,性能更高(因为
。每个
都是从这些方法内部调用的)。这里绝对没有理由合并一个
each
——它就像使用
.each(function(){$(this).addClass(…);})
一样毫无意义

顺便说一句,也许你在寻找一个能让你的表情更简短的词:

$('#mainNav > ul > li:has(ul)').addClass('hasSub');
如果您想确保
ul
是列表项的直接子项,您可能仍然希望使用注释中的建议(最接近的(li)
始终是ul的直接父项):

这两种方法的作用是一样的,但是用一种方法代替另一种方法有什么意义吗

对。第二个方法更短,性能更高(因为
。每个
都是从这些方法内部调用的)。这里绝对没有理由合并一个
each
——它就像使用
.each(function(){$(this).addClass(…);})
一样毫无意义

顺便说一句,也许你在寻找一个能让你的表情更简短的词:

$('#mainNav > ul > li:has(ul)').addClass('hasSub');
如果您想确保
ul
是列表项的直接子项,您可能仍然希望使用注释中的建议(最接近的(li)
始终是ul的直接父项):

您可以使用jQuery方法,它的可读性更好:

var addClass = $('nav#mainNav > ul > li').has('ul').addClass('hasSub');
您可以使用jQuery方法,它的可读性更好:

var addClass = $('nav#mainNav > ul > li').has('ul').addClass('hasSub');

大多数jQuery方法将对元素集合进行操作,并像使用
.each()
一样自动迭代。因此,人们通常不会在这样简单的情况下使用
.each()

但是,如果需要基于每个元素执行多个操作,则可能需要使用
.each()
。例如

$('nav#mainNav > ul > li > ul').each(function () {
    $(this).closest('li').addClass('hasSub');
    $(this).closest('.otherClass').removeClass('.otherClass');
});
您可以使用
.end()
在不使用
.each()
的情况下编写此代码:


但是我相信
.each()
会让意图更清晰(尽管像这样的缩进也做得很好)。

大多数jQuery方法都会对元素集合进行操作,并像使用
.each()
一样自动迭代。因此,人们通常不会在这样简单的情况下使用
.each()

但是,如果需要基于每个元素执行多个操作,则可能需要使用
.each()
。例如

$('nav#mainNav > ul > li > ul').each(function () {
    $(this).closest('li').addClass('hasSub');
    $(this).closest('.otherClass').removeClass('.otherClass');
});
您可以使用
.end()
在不使用
.each()
的情况下编写此代码:

但是我相信
.each()
会让意图更清晰(尽管缩进,像这样,也做得很好)。

当应用不同元素的逻辑时,应该明确地使用迭代(
.each
)。否则,隐式迭代就可以了

您的代码示例与页面几乎完全相同:

注意:大多数返回jQuery对象的jQuery方法也会循环 通过jQuery集合中的元素集-一个已知的过程 作为隐式迭代。发生这种情况时,通常没有必要 使用
.each()
方法显式迭代


例如,您也可以使用
,而不是使用选择器选择嵌套在
li
s中的
ul
s并遍历一个级别。每个
对包含
ul
s的
li
s应用逻辑测试:

$('#mainNav > ul > li').each(function() {
   if ($(this).children('ul').length) {
       $(this).addClass('hasSub'); 
   }
});
虽然这更冗长,但本质上是一样的


就代码高尔夫而言,如评论和Bergi的回答中所述,
li:has(ul)
将是实现这一目标的最短方法,无需调用
.closest()
。虽然
:has
与子选择器本质上不同-
:has
查找子代(不同级别的深度),而
查找直接子代(1级别的深度)-我认为它也应该适用于此特定用例。

明确迭代(
.each
)应在应用元素之间变化的逻辑时使用。否则,隐式迭代就可以了

您的代码示例与页面几乎完全相同:

注意:大多数返回jQuery对象的jQuery方法也会循环 通过jQuery集合中的元素集-一个已知的过程 作为隐式迭代。发生这种情况时,通常没有必要 使用
.each()
方法显式迭代


例如,您也可以使用
,而不是使用选择器选择嵌套在
li
s中的
ul
s并遍历一个级别。每个
对包含
ul
s的
li
s应用逻辑测试:

$('#mainNav > ul > li').each(function() {
   if ($(this).children('ul').length) {
       $(this).addClass('hasSub'); 
   }
});
虽然这更冗长,但本质上是一样的



就代码高尔夫而言,如评论和Bergi的回答中所述,
li:has(ul)
将是实现这一目标的最短方法,无需调用
.closest()
。虽然
:has
本质上与子选择器不同-
:has
查找子代(不同级别的深度),而
查找直接子代(1级别的深度)-我相信它也适用于此特定用例。

之后,它们在功能上是完全相同的,第二个在语法上只是稍微短了一点。哎哟,这对我来说是个意外,在每一个编辑中,你可能可以用parent()替换最近的('li')。它将始终是带有选择器的parent(
li>ul
parent('li')
可能不是你想象的那样。仅当父对象是
li
时,才会选择该父对象。我