为什么会出现这个错误,我如何可以测试它,所以它不会打破,我想检查空,但显然是不会工作,谢谢。
请不要建议,不写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有效性规则,以便松懈。 它无法处理任何有效证件。
如果你真的需要能够处理任何类型的有效身份证件的,可使用
$(document.getElementById(jsonTest[0].myId))
事实上,你不应该使用$('#'+id)
,因为它只是增加了一个无用的(并且有点危险)解析进行同样的操作层。
如果我理解你的问题,你有一个包含特殊字符的ID。 你基本上需要逃避他们 ,以便他们为文字字符,而不是查询选择处理:
使用任何元字符(如“#$%&'()* +,/ :; <=> @ [] ^`!?{|}〜)作为名称的文本部分,它必须转义与两个反斜杠:\例如,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>
编辑:当然,dystroy的回答-omit jQuery的选择引擎,并且使用getElementByID()
-是方式更实用。 jQuery的手动链接一个有趣的博客条目 ,涵盖这和其他相关技术:
的document.getElementById()和像document.getElementsByClassName类似的功能()可以只使用转义属性值,它是在HTML中使用的方式。 当然,你必须转义任何引号,这样你仍然结束了一个有效的JavaScript字符串。
W3C定义了一个新的函数,这: CSS.escape()
在您的示例代码,它应该是这样的:
var jsonTest = [
{
"myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''",
}
];
$('#' + CSS.escape(jsonTest[0].myId)).length; // Works
浏览器还不支持它,但是有一个填充工具库,你可以在此期间使用: https://github.com/mathiasbynens/CSS.escape
我已经在我的项目成功使用过它。