2013-03-11 9 views
17

मुझे यह त्रुटि क्यों मिलती है और मैं इसके लिए कैसे परीक्षण कर सकता हूं ताकि यह तोड़ न सके, मैंने शून्य की जांच करने की कोशिश की लेकिन जाहिर है कि काम नहीं करेगा, धन्यवाद।Jquery सिंटेक्स त्रुटि, अपरिचित अभिव्यक्ति:

कृपया इस तरह की आईडी न लिखने की सलाह न दें क्योंकि मुझे यह गलत लगता है लेकिन यह एक संभावना है।

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

इस regex "''''''\"\"\"\"'''''''''''''\"#####$'''''" या अधिक बस "'" के लिए के लिए विफल रहता है:

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

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

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

उत्तर

35

jQuery के एक आईडी के आधार चयनकर्ता का पता लगाने के लिए इस कोड का उपयोग करता है।

क्वेरी इंजन सीमित है, जो इतनी संक्षिप्त भाषा और आईडी वैधता नियमों के लिए बहुत आश्चर्यजनक नहीं है। यह किसी मान्य आईडी को संभाल नहीं सकता है।

तुम सच में, का उपयोग

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

वास्तव में वैध पहचान पत्र के किसी भी प्रकार को संभालने में सक्षम होने की जरूरत है, तो आप $('#'+id) का उपयोग कभी नहीं करना चाहिए, क्योंकि यह बस पार्स की एक बेकार (और एक छोटे से खतरनाक) परत जोड़ता है एक ही ऑपरेशन के लिए।

+1

हैश से बचने से भी मदद मिल सकती है। – VisioN

+0

@VisioN यह पर्याप्त नहीं होगा। –

+1

धन्यवाद dystroy यह एक शानदार समाधान है –

8

यदि मैं आपका प्रश्न समझ गया, तो आपके पास एक आईडी है जिसमें विशेष वर्ण हैं। आप मूल रूप से 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 के जवाब jQuery चयन इंजन -omit और getElementByID() का उपयोग करें - जिस तरह से और अधिक व्यावहारिक है। jQuery मैनुअल links an interesting blog entry है कि इस और अन्य संबंधित तकनीकों को शामिल किया गया:

document.getElementById() और document.getElementsByClassName (तरह समान कार्य) बस नहीं छोड़ा जाएगा विशेषता मूल्य, जिस तरह से यह HTML में प्रयोग किया जाता है का उपयोग कर सकते हैं। बेशक, आपको किसी भी उद्धरण से बचने के लिए होगा ताकि आप अभी भी एक वैध जावास्क्रिप्ट स्ट्रिंग के साथ समाप्त हो जाएं।

1

डब्ल्यू 3 सी ने इस के लिए एक नया कार्य परिभाषित किया है: CSS.escape()।अपने उदाहरण कोड में, यह इस तरह दिखेगा:

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

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

ब्राउज़र अभी तक इसका समर्थन नहीं करते, लेकिन वहाँ है कि आप का मतलब समय में उपयोग कर सकते हैं एक polyfill पुस्तकालय है: https://github.com/mathiasbynens/CSS.escape

मैंने इसे मेरे प्रोजेक्ट में सफलता के साथ इस्तेमाल किया।

संबंधित मुद्दे