2013-03-11 29 views
17

Neden bu hatayı alıyorum ve nasıl sınamayacağım ki, kırılmayacak şekilde denedim, boşluğu denetlemeyi denedim ama açıkça işe yaramayacaksınız, teşekkürler.Jquery Sözdizimi hatası, tanınmayan ifade:

Lütfen kimliğini yanlış yazdığımdan böyle yazmamaya dikkat edin, ama bu bir ihtimaldir.

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

Bu regex basitçe "'" için "''''''\"\"\"\"'''''''''''''\"#####$'''''" veya daha fazla başarısız:

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

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

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

cevap

35

jQuery en bir kimlik bazlı seçici algılamak için bu kodu kullanır.

Sorgu altyapısı sınırlı, bu nedenle çok kısa bir özdeyiş dili ve kimlik geçerlilik kuralları için çok şaşırtıcı değil. geçerli bir kimlikle başa çıkamaz. Gerçekten, geçerli kimlik her türlü idare edebilmek için gereken Aslında

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

kullanırsanız sadece ayrıştırma işe yaramaz bir (ve biraz tehlikeli) katmanı ekler olarak

, sen $('#'+id) kullanmak asla Aynı işlem için.

+1

Kaçan hatalar da yardımcı olabilir. – VisioN

+0

@VisioN Bu yeterli olmaz. –

+1

Harika bir çözüm olan dystroy teşekkürler –

8

Sorunuzu anladıysam, özel karakterler içeren bir kimliğiniz vardır. Temelde need to escape them yüzden ziyade sorgu seçicileri daha olarak normal karakterlerle davranılıyor:!.

meta karakterler (örneğin "# $% & '() * +, herhangi birini kullanmak için/:; < =>? @ []^`{|} ~), Bir adın basit bir parçası olarak, , iki ters eğik çizgi ile birlikte kullanılmalıdır: \. Örneğin, id =" foo.bar "olan bir öğe, .

seçici $ ("# fon \ .bar") kullanın ... ve bu durumda da, dize sınırlayıcı için ek kaçış düzeyi gerekli ". Bu çılgınlık ama inci

<!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> 

Düzenleme: eserler olduğunu Tabii, dystroy cevabı jQuery seçimi motoru -omit ve getElementByID() kullanmak - yol daha pratiktir. jQuery bu ve diğer ilgili teknikleri kapsayan manuel links an interesting blog entry:

document.getElementById() ve document.getElementsByClassName (gibi benzer fonksiyonlar) sadece çıkış kullanılmayan nitelik değeri, bu HTML kullanılan şekilde kullanabilirsiniz. Tabii ki, geçerli bir JavaScript dizgisi ile sonuçlanabilmeniz için herhangi bir alıntıdan kaçmanız gerekir.

1

W3C, bunun için yeni bir işlev tanımlamıştır: CSS.escape().örnek kodla olarak, şu şekilde görünecektir:

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

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

Tarayıcılar henüz desteklemez, ancak bu arada kullanabileceğiniz bir polyfill kütüphane bulunmaktadır: Ben ettik https://github.com/mathiasbynens/CSS.escape

projemde başarı ile kullandı.