是否有一个特殊的原因,为什么jQuery的addClass()不是正确的修剪?

时间:2012-01-04 20:55:04

标签: jquery trim addclass

<div id="myDiv" class=" blueberry mango "></div>

如果我们使用.addClass()

$("#myDiv").addClass("carrot");

myDiv的课程现在是"(no-space)blueberry mango(double-space)carrot"

有一个left-trim,但芒果和胡萝卜之间有两个空格,因为没有right-trim

  • jQuery的addClass()是不是有特殊原因 右修整?
  • 或者左边的装饰甚至不打算?

3 个答案:

答案 0 :(得分:7)

似乎jQuery在添加类之后正在进行修剪。请参阅下面的jquery addclass代码,

addClass: function( value ) {
    var classNames, i, l, elem,
        setClass, c, cl;

    if ( jQuery.isFunction( value ) ) {
        return this.each(function( j ) {
            jQuery( this ).addClass( value.call(this, j, this.className) );
        });
    }

    if ( value && typeof value === "string" ) {
        classNames = value.split( rspace );

        for ( i = 0, l = this.length; i < l; i++ ) {
            elem = this[ i ];

            if ( elem.nodeType === 1 ) {
                if ( !elem.className && classNames.length === 1 ) {
                    elem.className = value;

                } else {
               //HERE IS APPENDS ALL CLASS IT NEEDS TO ADD
                    setClass = " " + elem.className + " ";

                    for ( c = 0, cl = classNames.length; c < cl; c++ ) {
                        if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
                            setClass += classNames[ c ] + " ";
                        }
                    }
                    elem.className = jQuery.trim( setClass );
                }
            }
        }
    }

    return this;
}

所以就像下面一样,

jQuery.trim(" blueberry mango " + " " + "carrot")

答案 1 :(得分:2)

这是因为jQuery将类附加到类列表,然后在整个字符串上运行trim

查看source for addClass以查看正在发生的事情。

答案 2 :(得分:0)

看看消息来源,我猜测没有理由:

setClass = " " + elem.className + " ";

for ( c = 0, cl = classNames.length; c < cl; c++ ) {
    if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
        setClass += classNames[ c ] + " ";
    }
}
elem.className = jQuery.trim( setClass );

是的,在每个类之前和之后都有一个空格有助于查找新类(正在添加)是否已经存在,但仍然可以用以下内容替换第一行:

setClass = " " + jQuery.trim(elem.className) + " ";

它仍然会以同样的方式工作......