假设我有某个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具有该类。我想知道最后点击了哪个按钮,取消点击之前点击过的按钮,并将其显示给客户端。
什么是更好的方法,跟踪最后点击按钮的变量,以便我可以将其更改为“未点击”按钮。当点击另一个时,或只是针对整个班级?
我要问的部分原因是因为如果我定位整个类,并从所有这些对象中删除一个样式或类,它需要的代码更少,但是,我修改了许多元素。但是如果我保留一个变量,我只修改了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');
});