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

22

我为什么会遇到这个错误,如何测试以免出现错误。我尝试检查null值,但显然这不起作用,谢谢。

请不要建议不要像这样编写ID,因为我知道它是错误的,但这是可能的。

var jsonTest = [
  {
    "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''",
  }
];

alert(jsonTest[0].myId); 
// Works - alerts the myId

$('#' + jsonTest[0].myId ).length; 
// Error: Syntax error, unrecognized expression:
// #''''''""""'''''''''''''"#####$'''''
4个回答

44

jQuery使用以下代码来检测基于ID选择器的选择器:

characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+"
...
"ID": new RegExp( "^#(" + characterEncoding + ")" ),

这个正则表达式不能处理"''''''\"\"\"\"'''''''''''''\"#####$'''''",或者更简单地说,无法处理"'"

查询引擎受限制,这对于一种如此简洁的语言和身份验证规则如此宽松并不奇怪。它无法处理任何有效的标识符。

如果您确实需要能够处理任何类型的有效标识符,请使用

$(document.getElementById(jsonTest[0].myId))

实际上,你不应该使用$('#'+id),因为它只是为相同操作添加了一个无用的(且有点危险的)解析层。


1
哈希值转义可能也有所帮助。 - VisioN
1
@VisioN 这还不够。 - Denys Séguret
1
谢谢dystroy,这是一个很棒的解决方案。 - Hello-World

8
如果我理解您的问题,您有一个包含特殊字符的ID。您基本上需要对它们进行转义,以便将其视为文字而不是查询选择器:需要转义

要使用任何元字符(例如 !"#$%&'()*+,./:;<=>?@[]^`{|}~)作为名称的文字部分,必须使用两个反斜杠进行转义:\. 例如,具有 id="foo.bar" 的元素可以使用选择器 $("#foo\.bar")。

在这种情况下,您还需要为字符串定界符"添加另一层转义级别。虽然有些疯狂,但这样做是可以的。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><title></title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript"><!--
jQuery(function($){
    console.log( $("#" + "\\'\\'\\'\\'\\'\\'\\\"\\\"\\\"\\\"\\'\\'\\'\\'\\'\\'\\'\\'\\'\\'\\'\\'\\'\\\"\\#\\#\\#\\#\\#\\$\\'\\'\\'\\'\\'").length );
});
//--></script>
</head>
<body>

<div id="''''''&quot;&quot;&quot;&quot;'''''''''''''&quot;#####$'''''">Foo</div>

</body>
</html>

编辑:当然,dystroy的答案——省略jQuery选择引擎并使用getElementByID()——更实用。jQuery手册链接了一篇有趣的博客文章,介绍了这个方法和其他相关技巧:

document.getElementById()和类似的函数如 document.getElementsByClassName()可以直接使用未转义的属性值(即HTML中的写法)。当然,您仍需要转义任何引号,以便最终得到有效的JavaScript字符串。


4

W3C定义了一个新函数用于此: CSS.escape()。 在您的示例代码中,它将如下所示:

var jsonTest = [
  {
    "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''",
  }
];

$('#' + CSS.escape(jsonTest[0].myId)).length; // Works 

浏览器尚不支持此功能,但在此期间您可以使用polyfill库: https://github.com/mathiasbynens/CSS.escape 我在我的项目中成功地使用了它。

0

我在将 jQuery 1.6 升级到 jQuery 3.6 时遇到了这个错误。

我在 flexigrid 库 中遇到了这个错误。如上面的答案所述,解决这个问题很简单。

您需要转义所有特殊字符并在需要在网格中显示或进行进一步处理时取消转义

代码如下:

var str = "abc@abc.com";

//make str value to, basically escape all special chars : "abc/@abc/.com"
str = str.replace(/[.*+?^$@%{}()|[\]\\]/g, '\\$&');

//do some processing

//revert str value to: "abc@abc.com"
str = str.replaceAll("\\", ""); 
                                    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接