2013-03-11 108 views
17

为什么我得到这个错误,我怎么测试它,所以它不会中断,我试着检查null,但显然不会工作,谢谢。Jquery语法错误,无法识别的表达式:

请不要建议不要写这样的ID,因为我知道它错了,但它是一种可能性。

var jsonTest = [ 
    { 
    "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''", 
    } 
]; 

alert(jsonTest[0].myId); 
// Works - alerts the myId 

$('#' + jsonTest[0].myId).length; 
// Error: Syntax error, unrecognized expression: 
// #''''''""""'''''''''''''"#####$''''' 

回答

35

jQuery的使用这个代码来检测的基于ID的选择:

characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+" 
... 
"ID": new RegExp("^#(" + characterEncoding + ")"), 

这正则表达式"''''''\"\"\"\"'''''''''''''\"#####$'''''"或者更简单的"'"失败。

查询引擎是有限的,这对于如此简洁的语言和ID有效性规则如此宽松并不是很令人惊讶。它不能处理任何有效的ID。

如果你真的需要能够处理任何类型的有效身份证件,使用

$(document.getElementById(jsonTest[0].myId)) 

事实上,你不应该使用$('#'+id),因为它只是增加了分析的无用的(并且有点危险)层为同样的操作。

+1

哈希逃逸也可能有所帮助。 – VisioN 2013-03-11 12:40:29

+0

@VisioN这是不够的。 – 2013-03-11 12:46:26

+1

感谢dystroy这是一个很棒的解决方案 – 2013-03-11 13:00:14

8

如果我理解你的问题,你有一个包含特殊字符的ID。你基本上need to escape them所以他们视为文字字符,而不是查询选择:!

使用任何元字符(如 “#$%&“()* +,中/ :; < =>?@ [] ^`{|}〜)作为名称的文字部分,必须用两个反斜杠来转义: ,例如,带有 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> 

编辑:当然,dystroy的回答-omit jQuery的选择引擎,并使用getElementByID() - 是方式更实用。 jQuery的手动links an interesting blog entry覆盖这和其他相关技术:

的document.getElementById()和像 document.getElementsByClassName(类似的功能),可以只使用转义属性 值,它是在HTML中使用的方式。当然,你必须 转义任何引号,这样你仍然会得到一个有效的JavaScript 字符串。

1

W3C为此定义了一个新函数:CSS.escape()。在你的示例代码,它应该是这样的:

var jsonTest = [ 
    { 
    "myId": "''''''\"\"\"\"'''''''''''''\"#####$'''''", 
    } 
]; 

$('#' + CSS.escape(jsonTest[0].myId)).length; // Works 

的浏览器还不支持它,但是有一个填充工具库,你可以在此期间使用: https://github.com/mathiasbynens/CSS.escape

我已经在我的项目中成功使用它。

相关问题