语法错误,无法识别的表达式:
Jquery Syntax error, unrecognized expression:
为什么我得到这个错误,我怎么能测试它,所以它不会打破,我试着检查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。基本上需要对它们进行转义,这样它们就会被视为文字字符而不是查询选择器:
使用任何元字符(如! " # $ %和 ;'()*+,./:;& lt; => ?@[]^ '{|}~)作为名称的文字部分,它必须用两个反斜杠转义:'。例如,带有的元素id = " foo。,可以使用选择器$("#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>
编辑:当然,dystroy的答案——省略jQuery选择引擎而使用getElementByID()
——更实用。jQuery手册链接了一个有趣的博客条目,其中涵盖了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
我在我的项目中成功地使用了它。
在从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("''", "");
- 错误:语法错误,无法识别的表达式:不支持的伪:无效/RectJS/Unit Testing
- 具有带大括号的字符串时无法识别的表达式
- 未捕获错误:语法错误,无法识别的表达式:input[@type=submit]
- javascript正则表达式来识别所有特殊字符
- jQuery选择器错误:无法识别的表达式
- 无法识别jQuery表达式
- jquery 1.8.0语法错误,无法识别的表达式:>
- JQuery无法识别的表达式[href=#undefined]
- jQuery中的查询选择器导致无法识别的表达式
- 如何修复 jQuery 1.8“语法错误,无法识别的表达式”错误
- 错误:错误:语法错误,无法识别的表达式:
- 属性选择器不起作用(语法错误、无法识别的表达式)
- jQuery:语法错误,无法识别的表达式:.Marketing&通讯
- 未捕获错误:语法错误,无法识别的表达式:ajaxsample/update_agenda(CodeIgniter)
- 如何使用正则表达式识别javascript函数
- Jquery语法错误,id选择器上的表达式无法识别
- 未捕获错误:语法错误,无法识别表达式Jquery选择器单引号与双引号
- Javascript:语法错误,无法识别的表达式:
- 使用正则表达式识别表达式中的[]
- 通过不显眼的验证正则表达式识别有效的youtube url在MVC 3中不起作用