Javascript Jquery语法错误,无法识别的表达式:
为什么我会出现这个错误,我如何测试它,使它不会中断,我尝试了检查为空,但显然这不起作用,谢谢 请不要建议不要这样写身份证,因为我知道这是错误的,但这是一种可能性Javascript Jquery语法错误,无法识别的表达式:,javascript,jquery,jquery-selectors,Javascript,Jquery,Jquery Selectors,为什么我会出现这个错误,我如何测试它,使它不会中断,我尝试了检查为空,但显然这不起作用,谢谢 请不要建议不要这样写身份证,因为我知道这是错误的,但这是一种可能性 var jsonTest = [ { "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''", } ]; alert(jsonTest[0].myId); // Works - alerts the myId $('#' + jsonTest[0].myId ).len
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包含特殊字符。您基本上可以将它们视为文字字符而不是查询选择器:
要使用任何元字符(例如
!“#$%&'()*+,./:;?@[]^`{124;}~)作为名称的文字部分,它必须
用两个反斜杠转义:\。例如,具有
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="''''''""""'''''''''''''"#####$'''''">Foo</div>
</body>
</html>
W3C为此定义了一个新函数:。在示例代码中,它如下所示:
var jsonTest = [
{
"myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''",
}
];
$('#' + CSS.escape(jsonTest[0].myId)).length; // Works
浏览器还不支持它,但您可以同时使用polyfill库:
我在我的项目中成功地使用了它。我在从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("\\", "");
散列转义也可能有帮助。@这还不够。谢谢你,这是一个很棒的解决方案