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

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

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

var jsonTest = [ { "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''", } ]; alert(jsonTest[0].myId); // Works - alerts the myId $('#' + jsonTest[0].myId ).length; // Error: Syntax error, unrecognized expression: // #''''''""""'''''''''''''"#####$''''' 

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

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

这个正则表达式失败了"''''''\"\"\"\"'''''''''''''\"#####$'''''"或更简单地用于"'"

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

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

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

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

如果我理解了您的问题,那么您的ID就包含特殊字符。 你基本上需要转义它们,因此它们被视为文字字符而不是查询选择器:

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

…在这种情况下,你还需要一个额外的字符串分隔符转义级别, " 。这很疯狂,但这有效:

        
Foo

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

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

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

 var jsonTest = [ { "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''", } ]; $('#' + CSS.escape(jsonTest[0].myId)).length; // Works 

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

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