Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Jquery语法错误,无法识别的表达式:_Javascript_Jquery_Jquery Selectors - Fatal编程技术网

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="''''''&quot;&quot;&quot;&quot;'''''''''''''&quot;#####$'''''">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("\\", ""); 
                                    

散列转义也可能有帮助。@这还不够。谢谢你,这是一个很棒的解决方案