Синтаксическая ошибка, непризнанное выражение:, $(селектор).before( "," );

Я использую эту одну строку кода уже пару лет с помощью jQuery 1.2.6.

$("#acListTemp div.amenitiesDiv label").before(",");

Я просто обновился до jQuery 1.6.1, и теперь он дает мне эту ошибку:

Синтаксическая ошибка, непризнанное выражение:,

Я также пробовал это, но он дал ту же ошибку:

theChar = ",";
$("#acListTemp div.amenitiesDiv label").before(theChar);

Я проверил страницу API jQuery для команды before, но я все еще в тупике. Любая помощь очень ценится!

Ответ 1

Если вы используете .insertBefore() вместо .before(), вы получите эту ошибку.

Ошибка не появляется с помощью insertBefore() в jQuery 1.2.6


Похоже, что ошибка возникает от Sizzle:

https://github.com/jquery/sizzle/blob/master/sizzle.js#L325-327

Sizzle.error = function( msg ) {
    throw "Syntax error, unrecognized expression: " + msg;
};

... поэтому я бы предположил, что где-то в вашем коде вы используете "," как селектор, возможно, в insertBefore() или какой-либо другой метод, который ожидает селектор.


EDIT:

Из приведенных ниже комментариев было определено, что jQuery не терпит неудачу, как ожидалось, при вызове .before() в отношении объекта jQuery, для которого не найдено совпадений для его селектора.

Похоже на ошибку, но я уверен, что у парней jQuery возникнет какая-то причина, почему это желаемое поведение.

Вы можете увидеть эту проблему здесь: https://github.com/jquery/jquery/blob/1.6.1/src/manipulation.js#L130-140

before: function() {
    if ( this[0] && this[0].parentNode ) {
        return this.domManip(arguments, false, function( elem ) {
            this.parentNode.insertBefore( elem, this );
        });
    } else if ( arguments.length ) {
        var set = jQuery(arguments[0]);
        set.push.apply( set, this.toArray() );
        return this.pushStack( set, "before", arguments );
    }
},

Как вы можете видеть, всего 2 теста.

  • Первая проверяет, есть ли хотя бы один элемент в объекте jQuery (и если у него есть parentNode). Если это так, он вставляет содержимое перед согласованными элементами.

  • Если элементов не было, он просто проверяет, были ли переданы какие-либо аргументы, и если это так, кажется, что первый - это селектор (или, возможно, тег), и он идет вперед и отправляет это функции jQuery.

var set = jQuery(arguments[0]);

Итак, если вы пытаетесь вставить ",", но ваш селектор не нашел совпадений, jQuery закончит:

var set = jQuery(",");

... который является недопустимым выражением для процесса Sizzle.