Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 保持变量或目标为整个类_Jquery_Html_Css - Fatal编程技术网

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)。