Jquery 保持变量或目标为整个类
假设我有一个特定Jquery 保持变量或目标为整个类,jquery,html,css,Jquery,Html,Css,假设我有一个特定类的jQuery点击处理程序,其中多个按钮/主体/部分都有该类。我想知道最后单击了哪个按钮,取消单击以前单击的任何按钮,并使其对客户机明显可见 更好的方法是,跟踪上次单击按钮的变量,以便在单击另一个按钮时将其更改为“未单击”,或者仅针对整个类 我问这个问题的部分原因是,如果我以整个类为目标,并从所有这些对象中删除一个样式或类,它需要更少的代码,但是,我修改了许多元素。但是如果我保留了一个变量,我只修改了两个元素,一个已经被点击,另一个刚刚被点击 然而,保留一个变量意味着必须添加
类的jQuery点击处理程序,其中多个按钮/主体/部分都有该类。我想知道最后单击了哪个按钮,取消单击以前单击的任何按钮,并使其对客户机明显可见
更好的方法是,跟踪上次单击按钮的变量,以便在单击另一个按钮时将其更改为“未单击”,或者仅针对整个类
我问这个问题的部分原因是,如果我以整个类为目标,并从所有这些对象中删除一个样式或类,它需要更少的代码,但是,我修改了许多元素。但是如果我保留了一个变量,我只修改了两个元素,一个已经被点击,另一个刚刚被点击
然而,保留一个变量意味着必须添加条件逻辑,如果我只是说“从所有“按钮”中删除类“单击”,则不需要这样做。那么就性能而言,有没有更好的方法,或者它们是相对等效的呢?如果可以的话,最好避免使用全局或局部范围的变量(保持状态)
对于这种类型的场景,我将以类为目标(快速选择器)。从清除类中排除当前项并切换目标。这也允许打开/关闭
$(function() {
$('.button').on('click', function() {
$('.button').not(this).removeClass('clicked');
$(this).toggleClass('clicked');
});
});
JSFiddle:
除非每秒单击50000次,否则您不会在意任何速度差异,但如果您想要一个快速选择器,而不缓存它,这有点快,因为它会产生较少的结果:
$('.clicked').not(this).removeClass('clicked');
或者,缓存jQuery选择器:
$(function() {
var $buttons = $('.button').on('click', function() {
$buttons.not(this).removeClass('clicked');
$(this).toggleClass('clicked');
});
});
尽管如此,您还是希望使用最简单、最容易阅读/维护的选项,而不是试图变得太聪明/太快而失去可维护性 如果以整个类为目标,该类中的所有元素都将被迭代,jQuery将尝试为每个元素删除该类,即使它们没有该类
因此,跟踪上一个单击的按钮会更快,因为您只删除所需元素的类
如果存储jQuery元素包装器,速度会更快:
var$clicked=$();
$('.button')。在('click',function()上{
$clicked.removeClass('clicked');
$clicked=$(this.addClass('clicked');
});
在演示中的方式看起来很好。@tymeJV这种方式与另一种方式相比有什么优势吗?只需使用$('.button.clicked')。removeClass('clicked')
。这相当快,我认为速度差异不会影响您的应用程序。如果速度是一个问题:$('.button.clicked')。不是(这个)。removeClass('clicked')
@Karl AndréGagnon:从什么时候开始,一次点击事件就成了速度问题了!:)@Karl AndréGagnon::实际上,单个类选择器比您的示例更快,因为它直接命中浏览器缓存。几乎和现代浏览器上的ID搜索一样快。您的示例将匹配所有。单击然后对按钮进行筛选。是的,这一点都没有问题:)但我知道单类选择器在选择过程中速度更快,但它不会减慢。not()
和。removeClass()
的过程,因为有一个内部循环(至少在.removeClass()
中)?当然,这并不重要,它只是为了个人知识。@Karl AndréGagnon:奇怪的是,jquery每个
的测试都是针对一个的(var i=0;i
实际上,jQuery的性能要优于标准循环。这与直觉相反,但有一点很酷。无论如何,我都会避免基于状态的var
编码,而不是自包含的编码。它可以移植到多个控制场景,但单状态var不会。同样,尽管速度不是问题:)又一次散布恐慌。。。对于单次单击事件,速度不是问题。如果他们每秒点击50000次,这将带来不同。:)如果.button
元素(n
)的数量为10亿,并且在智能手机上运行,电池只剩下0.0001%,该怎么办?一个O(1)
算法总是比一个O(n)
算法好。使用一个委派的事件处理程序作为启动程序!:)如果您查看我以后的更新,您将看到它也是O(1)
:p您的代码仍然是O(n)
:$.fn.not
调用winnow
调用$.grep
调用(;i
。我说黑色。你说白色。只有一个匹配项的类选择器A)几乎和id选择器一样快,b)只迭代一个项,所以不是O(n)。