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
我在项目中成功使用了它。