Ответ 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.