语法错误,无法识别的表达式:,$(selector).before(“,”);

时间:2011-06-09 15:43:40

标签: javascript jquery

我使用jQuery 1.2.6已经使用了这一行代码几年了。

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

我刚刚升级到jQuery 1.6.1,现在它给了我这个错误:

  

语法错误,无法识别的表达式:   ,

我也试过这个,但它产生了同样的错误:

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

我检查了之前命令的jQuery API页面,但我仍然难过。非常感谢任何帮助!

1 个答案:

答案 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处理的无效表达式。