Есть ли конкретная причина, по которой метод jCuery addClass () не выполняет правую обрезку? - PullRequest
7 голосов
/ 05 января 2012
<div id="myDiv" class=" blueberry mango "></div>

Если мы используем .addClass ()

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

Класс myDiv теперь "(no-space)blueberry mango(double-space)carrot"

Существует left-trim, но между манго и морковью есть двойные пробелы, потому что не было right-trim

  • Есть ли какая-то конкретная причина, по которой addClass() в jQuery не обрезается правильно?
  • Или левая обрезка даже не была предназначена?

Ответы [ 3 ]

7 голосов
/ 05 января 2012

Похоже, что jQuery выполняет обрезку после добавления класса. Смотрите код jcery 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")

2 голосов
/ 05 января 2012

Это происходит потому, что jQuery добавляет класс в список классов, а затем запускает trim для всей строки.

Посмотрите на источник для addClass, чтобы увидеть, что происходит.

0 голосов
/ 05 января 2012

Глядя на источник, я предполагаю, что для этого нет причин:

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) + " ";

, и все равно будет работать так же ...

...