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


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

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

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

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

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

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

我检查了jQuery API页面中的before命令,但我仍然难过。任何帮助是极大的赞赏!


3164
2018-06-09 15:43


起源

对我来说似乎很好: 的jsfiddle。你确定这条线导致了这个问题吗?使用 @ 1.3+中的符号会导致该错误(资源)。 - Town
您是否正在使用花哨的引号,如问题标题中所示? - Jeremy
@Pointy:他收到语法错误。 - Jeremy
@Jeremy Heiler:这是我的第一个想法,但它们会自动添加到SO上的标题中。有趣的是(或不是)他们造成的 Syntax error: Unexpected token ILLEGAL 在Chrome中。 - Town
我认为错误来自jQuery内部,就像它试图将字符串解析为选择器一样。如果不是,那么你很可能是对的。 - Pointy


答案:


如果你正在使用 .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() 或者其他需要选择器的方法。


编辑:

从下面的评论中,已确定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处理的无效表达式。


11
2018-06-09 15:51



说得通;该 insertBefore function接受一个选择器表达式。该 , 是选择器语法中的特殊字符。 - Richard JP Le Guen
奇怪的是,Firefox和Safari在抛出错误时都没有显示行号。我很确定错误发生在该行上(我在行之前有一个日志语句,在行之后有另一个日志语句,所以我能够将问题隔离到那个确切的行)。所以我对帕特里克的答案感到困惑,这个答案表明问题出现在我脚本的其他地方。 FWIW这个错误:$(',')。insertBefore(“#acListTemp div.amenitiesDiv label”); - Dan
鉴于此 , 选择或语法中的特殊字符是否意味着我不能再插入一个 , 这条路?我能逃脱吗? - Dan
@Dan:这应该不足为奇 $(',').insertBefore("#acListTemp div.amenitiesDiv label"); 错误,因为你正在路过 "," 作为选择器字符串,抛出该错误。你可以插入一个 "," 正好。你不能将它用作选择器。您可能需要发布更多代码才能确定问题。在我的测试中,它可以做到 .before(',')。 - user113716
这是一个酒店预订表格,而且很长。不知道什么片段与之相关。 链接 第746行是发生错误的地方。 (如果我的代码很糟糕,我会自学成才,所以道歉!)。这是一个4页的表单,当您尝试提交时会出错 链接 (1.2.6确定虽然@index.shtml)。此功能抓取一大块HTML(分项存款,引用给客户),对其进行消毒,然后将其投入文本区域字段,以便可以与预订一起提交。 - Dan