我使用jQuery 1.2.6已经使用了这一行代码几年了。
$("#acListTemp div.amenitiesDiv label").before(",");
我刚刚升级到jQuery 1.6.1,现在它给了我这个错误:
语法错误,无法识别的表达式: ,
我也试过这个,但它产生了同样的错误:
theChar = ",";
$("#acListTemp div.amenitiesDiv label").before(theChar);
我检查了之前命令的jQuery API页面,但我仍然难过。非常感谢任何帮助!
答案 0 :(得分:11)
如果您使用.insertBefore()
代替.before()
,则会收到该错误。
在jQuery 1.2.6
中使用insertBefore()
不会出现错误
看起来错误来自Sizzle:
https://github.com/jquery/sizzle/blob/master/sizzle.js#L325-327
Sizzle.error = function( msg ) {
throw "Syntax error, unrecognized expression: " + msg;
};
...所以我猜你代码中的某个地方你使用","
作为选择器,可能在insertBefore()
或其他需要选择器的方法中。
修改强>
根据下面的评论,已经确定jQuery在针对没有为其选择器找到匹配项的jQuery对象调用.before()
时,按照预期静默地不失败。
对我来说似乎是一个错误,但我确信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处理的无效表达式。