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

Hel*_*rld 19 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:
// #''''''""""'''''''''''''"#####$'''''
Run Code Online (Sandbox Code Playgroud)

Den*_*ret 38

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

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

这个正则表达式失败"''''''\"\"\"\"'''''''''''''\"#####$'''''"或更简单"'".

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

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

$(document.getElementById(jsonTest[0].myId))
Run Code Online (Sandbox Code Playgroud)

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


Álv*_*lez 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>
Run Code Online (Sandbox Code Playgroud)

编辑:当然,dystroy的答案-omit jQuery选择引擎和使用getElementByID()- 更实用.jQuery手册链接了一个有趣的博客条目,涵盖了这个和其他相关技术:

document.getElementById()和类似函数(如document.getElementsByClassName())只能使用未转义的属性值,即在HTML中使用的方式.当然,您必须转义任何引号,以便最终得到一个有效的JavaScript字符串.