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

时间:2013-03-11 12:36:39

标签: javascript jquery jquery-selectors

为什么我会收到此错误,如何测试它以便它不会破坏,我尝试检查null但显然不会工作,谢谢。

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

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

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

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

4 个答案:

答案 0 :(得分:38)

jQuery使用此代码来检测基于id的选择器:

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

这个正则表达式仅针对"''''''\"\"\"\"'''''''''''''\"#####$'''''" "'"或更多{}失败。

查询引擎是有限的,这对于如此简洁的语言和id有效性规则来说并不是很令人惊讶。它无法处理任何有效的ID。

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

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

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

答案 1 :(得分:8)

如果我理解了您的问题,则您的ID包含特殊字符。你基本上need to escape them所以它们被视为文字字符而不是查询选择器:

  

使用任何元字符(例如   !“#$%&'()* +,。/:;< =>?@ [] ^`{|}〜)作为名称的字面部分,必须   用两个反斜杠逃脱:\。例如,一个元素   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的答案-omit jQuery选择引擎并使用getElementByID() - 更实用。 jQuery手册links an interesting blog entry,涵盖了这个和其他相关技术:

  

document.getElementById()和类似的函数一样   document.getElementsByClassName()只能使用未转义的属性   值,它在HTML中的使用方式。当然,你必须这样做   转义任何引号,以便您仍然使用有效的JavaScript   字符串。

答案 2 :(得分:2)

W3C为此定义了一个新功能:CSS.escape()。在您的示例代码中,它看起来像这样:

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

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

浏览器还不支持它,但是有一个polyfill库可以在平均时间内使用: https://github.com/mathiasbynens/CSS.escape

我在项目中成功使用了它。

答案 3 :(得分: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("\\", "");