Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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_Performance - Fatal编程技术网

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插件来完成。
当然,这不是最快的方法,但我认为它可读性很强。为了提高效率,您可以使用native
el.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')
    似乎正是我想要的。