保持变量或目标整个班级

时间:2015-05-06 20:07:05

标签: jquery html css

假设我有某个A EQU 0x2000000 R EQU 0x2000004 X EQU 0x2000008 Y EQU 0x200000C Z EQU 0x2000010 LDR R7, =X LDR R0, [R7] ADD R0, #5 ; X = 5 in R0 CMP R0, #4 ; Compare X != 4 BNE jumpToY jumpToY LDR R7, =Y LDR R1, [R7] ; Y = 10 in R1 CMP R1, #10 ; Compare Y == 10 BEQ jumpToZ jumpToZ etc... 的jQuery点击处理程序,其中多个按钮/ body / section具有该类。我想知道最后点击了哪个按钮,取消点击之前点击过的按钮,并将其显示给客户端。

什么是更好的方法,跟踪最后点击按钮的变量,以便我可以将其更改为“未点击”按钮。当点击另一个时,或只是针对整个班级?

demo

我要问的部分原因是因为如果我定位整个类,并从所有这些对象中删除一个样式或类,它需要的代码更少,但是,我修改了许多元素。但是如果我保留一个变量,我只修改了2个元素,即已经点击的元素,以及刚刚点击的元素。

但是,保留变量意味着必须添加条件逻辑,如果我只是说"删除类'点击'来自所有'按钮'"。那么就性能而言,有哪种方式更好或者它们是相对等同的?

2 个答案:

答案 0 :(得分:3)

如果可以的话,最好避免使用保持状态的全局或本地范围变量。

对于这种类型的场景,我会定位类(快速选择器)。从清除类中排除当前项目并切换目标。这也允许开/关。

$(function() {
    $('.button').on('click', function() {
        $('.button').not(this).removeClass('clicked');
        $(this).toggleClass('clicked');
    });
});

JSFiddle: http://jsfiddle.net/ou1wy5vt/2/

你不会关心任何速度差异,除非你每秒点击50,000次,但是如果你想要一个快速选择器而没有缓存它,这有点快,因为它会有较少的结果:

$('.clicked').not(this).removeClass('clicked');

或者,缓存jQuery选择器:

$(function() {
    var $buttons = $('.button').on('click', function() {
        $buttons.not(this).removeClass('clicked');
        $(this).toggleClass('clicked');
    });
});

同样,你想要最简单,最容易阅读/维护的选项,而不是试图过于聪明/快速而失去可维护性。

答案 1 :(得分:1)

如果你定位整个类,那么该类中的所有元素都将被迭代,jQuery将尝试删除每个类的类,即使它们没有它。

因此,跟踪上一个单击的按钮会更快,因为您只删除了所需元素的类。

如果存储了jQuery元素包装器,它会更快:

var $clicked = $();
$('.button').on('click', function() {
    $clicked.removeClass('clicked');
    $clicked = $(this).addClass('clicked');
});