Jquery 在多个状态之间切换的最佳策略?
我目前有三门课:Jquery 在多个状态之间切换的最佳策略?,jquery,performance,Jquery,Performance,我目前有三门课:a,b,和c 元素一次只能有其中一个类 我目前的方法是,每次需要更改类时,只需调用以下命令: $('#element').addClass('a').removeClass('b c'); 还有其他方法可以达到同样的效果,但从长远来看,使用属性选择器可能会更昂贵。这不是一个三态循环,因为我有时可能需要将a切换到b,反之亦然。我的上述方法是最有效的战略绩效明智吗?如果没有,那么什么更好,或者我可以搜索哪些术语来为我指明正确的方向?使用切换类如何?如果只有3个类,则可以保留一些状态
a
,b
,和c
元素一次只能有其中一个类
我目前的方法是,每次需要更改类时,只需调用以下命令:
$('#element').addClass('a').removeClass('b c');
还有其他方法可以达到同样的效果,但从长远来看,使用属性选择器可能会更昂贵。这不是一个三态循环,因为我有时可能需要将
a
切换到b
,反之亦然。我的上述方法是最有效的战略绩效明智吗?如果没有,那么什么更好,或者我可以搜索哪些术语来为我指明正确的方向?使用切换类如何?如果只有3个类,则可以保留一些状态如下的数组:
var states = {
a: true,
b: false,
c: false
}
function toggle(el, state) {
var $el = $(el);
for( var class in state)
$el.toggleClass(class, state[class]);
}
toggle( someEl, states);
它也可以作为jQuery插件来完成。
当然,这不是最快的方法,但我认为它可读性很强。为了提高效率,您可以使用nativeel.className
(当您只有3个类时,这可能是最好的方法)。首先,除非您同时执行数千次,否则我相当怀疑调用的性能。removeClass('b c')
的性能是否会更引人注目。我的一般规则是按以下顺序编写代码:
正确性
可读性和可维护性
高效/紧凑
演出
如果我发现了一个合理的性能问题,并且已经分析/测量了正在发生的事情,足以知道哪段代码需要改进,然后可以测量我是否真的在改进它,那么我只会在性能上花费任何开发周期
如果对象上没有其他类,则最简单的方法是只设置新的类名:
$('#element').attr('class', 'a');
如果对象上确实有其他类名,并且您事先知道它们是什么,则可以执行以下操作:
$('#element').attr('class', 'a ' + otherClassNmes);
如果您不想预先知道其他类名,那么您需要查找这两个类名,并删除它们(如果存在)。您可以查看jQuery的.removeClass()
代码,并确切了解它的功能
removeClass: function( value ) {
var classes, elem, cur, clazz, j,
i = 0,
len = this.length,
proceed = arguments.length === 0 || typeof value === "string" && value;
if ( jQuery.isFunction( value ) ) {
return this.each(function( j ) {
jQuery( this ).removeClass( value.call( this, j, this.className ) );
});
}
if ( proceed ) {
classes = ( value || "" ).match( core_rnotwhite ) || [];
for ( ; i < len; i++ ) {
elem = this[ i ];
// This expression is here for better compressibility (see addClass)
cur = elem.nodeType === 1 && ( elem.className ?
( " " + elem.className + " " ).replace( rclass, " " ) :
""
);
if ( cur ) {
j = 0;
while ( (clazz = classes[j++]) ) {
// Remove *all* instances
while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
cur = cur.replace( " " + clazz + " ", " " );
}
}
elem.className = value ? jQuery.trim( cur ) : "";
}
}
}
return this;
},
removeClass:函数(值){
变量类,元素,cur,clazz,j,
i=0,
len=这个长度,
继续=参数。长度===0 | |值的类型===“字符串”&&value;
if(jQuery.isFunction(value)){
返回此。每个函数(j){
jQuery(this.removeClass)(value.call(this,j,this.className));
});
}
如果(继续){
类=(值| |“”).match(核心值)| |[];
对于(;i=0){
cur=cur.replace(“+clazz+”,”);
}
}
elem.className=value?jQuery.trim(cur):“”;
}
}
}
归还这个;
},
+1这绝对是一个可读的解决方案,我根本没有想到将类放入数组中并循环遍历它们。但是,理想情况下,有一种直观而直接的方法要求元素一次只有一个类。看来@jfriend00的attr('class','a')
正是我想要的。谢谢你提供了全面的选择,现在。attr('class','a')
似乎正是我想要的。