भागने के उद्धरण जावास्क्रिप्ट में


211

मैं एक डेटाबेस से मानों को आउटपुट कर रहा हूं (यह वास्तव में सार्वजनिक प्रविष्टि के लिए खुला नहीं है, लेकिन यह कंपनी में एक उपयोगकर्ता द्वारा प्रविष्टि के लिए खुला है - मतलब, मैं एक्सएसएस के बारे में चिंतित नहीं हूं )।

मैं इस तरह एक टैग उत्पादन करने की कोशिश कर रहा हूँ:

<a href="" onclick="DoEdit('DESCRIPTION');">Click Me</a>

विवरण वास्तव में डेटाबेस से एक मूल्य है जो कुछ इस प्रकार है:

Prelim Assess "Mini" Report

मैंने "with \" को बदलने की कोशिश की है, लेकिन कोई फर्क नहीं पड़ता कि मैं क्या कोशिश करता हूं, फ़ायरफ़ॉक्स शब्द आकलन के बाद अंतरिक्ष के बाद मेरे जावास्क्रिप्ट कॉल को काट देता है , और यह सभी प्रकार के मुद्दों का कारण बन रहा है।

मुझे स्पष्ट उत्तर देना चाहिए, लेकिन मेरे जीवन के लिए मैं इसका पता नहीं लगा सकता।

किसी को मेरी मूर्खता को इंगित करने के लिए परवाह है?

यहां संपूर्ण HTML पृष्ठ है (यह अंततः ASP.NET पेज होगा , लेकिन इसे हल करने के लिए मैंने बाकी सब कुछ लेकिन समस्या कोड निकाल लिया)

<html>
    <body>
        <a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); return false;">edit</a>
    </body>
</html>

3
अपने onclickईवेंट अटैचमेंट को विवादास्पद बनाने और अपने सभी डेटाबेस की जानकारी को डेटा द्वीप में स्थानांतरित करने के लिए यह एक अच्छा विचार है । चीजें साफ-सुथरी होंगी और आपको वास्तव में कुछ प्रकार की सिंटैक्स त्रुटि मिलेगी जब आपके तार गलत बच जाते हैं।
जस्टिन जॉनसन


तुम भी बच ( "स्ट्रिंग") और अनएस्केप ( "स्ट्रिंग") jQuery तरीकों का उपयोग कर सकते हैं
अभिराम

जवाबों:


212

आपको उस स्ट्रिंग से बचने की ज़रूरत है जिसे आप DoEditदोहरे-उद्धरण वर्णों को साफ़ करने के लिए लिख रहे हैं । वे onclickHTML विशेषता को समय से पहले बंद करने का कारण बन रहे हैं ।

जावास्क्रिप्ट एस्केप चरित्र का उपयोग करना, \HTML संदर्भ में पर्याप्त नहीं है। आपको उचित एक्सएमएल इकाई प्रतिनिधित्व के साथ दोहरे-उद्धरण को बदलने की आवश्यकता है &quot;


ठीक है, लेकिन यह नहीं होगा? <a href="#" onclick="DoEdit('Preliminary Assessment \"Mini\"'); false पर लौटें। · संपादित करें </a> मैंने कोशिश की, और यह अभी भी खराब हो रहा है। यह एक साधारण डब्ल्यूटीएफ हो गया है, लेकिन मेरे जीवन के लिए, मैं इसे नहीं देख सकता।
मैट दाविद

क्या कोई अंतर्निहित जावास्क्रिप्ट फ़ंक्शन है जो दोहरे उद्धरण चिह्नों से बच जाएगा? , क्वो ’के अलावा।’ ’(’ ’’, ’’ & quot; ’’) मैं कुछ भी नहीं खोज सकता।
केविन

4
यह एक जावास्क्रिप्ट मुद्दा नहीं है, यह एक HTML / XML एन्कोडिंग मुद्दा है: आपके पास विशेषताओं वाले मूल्य w / o के अंदर दोहरे-उद्धरण वर्ण नहीं हो सकते हैं ... अन्यथा ब्राउज़र / पार्सर सोचते हैं कि आप विशेषता मान घोषणा को समाप्त कर रहे हैं।
हारून

22
उदाहरण प्रतिस्थापन कोड:'mystring'.replace(/"/g, '&quot;');
जोशुआ बर्न्स

3
पिछली टिप्पणी में एक अतिरिक्त उद्धरण है। जो कोड काम करता है वह है ring मिस्ट्रींग ’।replace (/’ / g, ’& quot;’);
अगस्टिन लोपेज

95

&quot; HTML संदर्भ की वजह से, मेरे सामने सुझाव के अनुसार इस विशेष मामले में काम करेगा।

हालाँकि, यदि आप चाहते हैं कि आपका जावास्क्रिप्ट कोड स्वतंत्र रूप से किसी भी संदर्भ के लिए बच जाए, तो आप देशी जावास्क्रिप्ट एन्कोडिंग का विकल्प चुन सकते हैं: यह
'बन \x27
"जाता है\x22

तो आपका onclick बन जाएगा:
DoEdit('Preliminary Assessment \x22Mini\x22');

यह उदाहरण के लिए भी काम करेगा जब एक जावास्क्रिप्ट स्ट्रिंग को एक अन्य जावास्क्रिप्ट विधि के पैरामीटर के रूप में पारित किया जाएगा ( alert()यह इसके लिए एक आसान परीक्षण विधि है)।

मैं आपको डुप्लिकेट स्टैक ओवरफ्लो प्रश्न का उल्लेख कर रहा हूं, मैं ऑनक्लिक हैंडलर के अंदर जावास्क्रिप्ट कोड के अंदर एक स्ट्रिंग कैसे बच सकता हूं?


2
धन्यवाद! आपका अधिक सही उत्तर है क्योंकि यह संदर्भ की परवाह किए बिना देशी जावास्क्रिप्ट है।
scarver2

2
यह सही जवाब है, हालांकि एक HTML संदर्भ में &quot;, निश्चित रूप से, काम का उपयोग करेगा।
ओलिवर

ध्यान दें कि &quot;इनपुट मानों में आवश्यक है, अर्थात, <input value="\x22quoted string\x22">काम नहीं करेगा।
थुडन

@ 10basetom स्वाभाविक रूप से, जावास्क्रिप्ट से बचना केवल जावास्क्रिप्ट संदर्भ में काम करता है, जैसे इवेंट हैंडलर ( onclick="...")। एक valueविशेषता के मूल्य को एक जावास्क्रिप्ट संदर्भ में संसाधित नहीं किया जा रहा है, केवल एक HTML संदर्भ में।
tsemer

प्रतिस्थापन कोड:'mystring'.replace(/"/g, '\\x22').replace(/'/g, '\\x27')
मुर्गियों


24

दोस्तों, unescapeजावास्क्रिप्ट में पहले से ही एक फंक्शन है जो इसके लिए अनसोल्डिंग करता है \":

<script type="text/javascript">
    var str="this is \"good\"";
    document.write(unescape(str))
</script>

2
"एस्केप" / "अनसेस्केप" के संयोजन ने वही किया जो मुझे चाहिए था। धन्यवाद।
लुइस आर।

8
बच / unescape को हटा दिया गया है। हालांकि एनकोडर्डी सिर्फ उद्धरणों से अधिक करता है। gotochriswest.com/blog/2011/05/23/escape-unescape-deprecated
chug2k

12

समस्या यह है कि HTML भागने वाले चरित्र को नहीं पहचानता है। आप HTML विशेषता के लिए एकल उद्धरण और ऑन्कलिक के लिए दोहरे उद्धरण चिह्नों का उपयोग करके चारों ओर काम कर सकते हैं।

<a href="#" onclick='DoEdit("Preliminary Assessment \"Mini\""); return false;'>edit</a>

5
ओह। मैं सोच रहा था कि अतीत में विशेषता के लिए मैंने स्वाभाविक रूप से 'का उपयोग करने का सहारा क्यों लिया। मैं बस इसे गहराई से कभी नहीं समझा। धन्यवाद।
मैट डॉवी

6

यह है कि मैं यह कैसे करते हैं, मूल रूप से str.replace(/[\""]/g, '\\"')

var display = document.getElementById('output');
var str = 'class="whatever-foo__input" id="node-key"';
display.innerHTML = str.replace(/[\""]/g, '\\"');

//will return class=\"whatever-foo__input\" id=\"node-key\"
<span id="output"></span>


2

यदि आप जावा में एचटीएमएल को असेंबल कर रहे हैं, तो आप अपाचे कॉमन-लैंग से इस उपयोगी उपयोगिता वर्ग का उपयोग सभी भागने से कर सकते हैं:

org.apache.commons.lang.StringEscapeUtils
जावा, जावा स्क्रिप्ट, एचटीएमएल, एक्सएमएल और एसक्यूएल के लिए आगे और पीछे भागता है।


मैं Java में methodExpression का निर्माण करने के लिए org.apache.commons.lang3.StringEscapeUtils.escapeEcmaScript (पाठ) का उपयोग करता हूं। धन्यवाद।
हारुन १

1

मैंने jQuery का उपयोग करके एक नमूना किया है

var descr = 'test"inside"outside';
$(function(){
   $("#div1").append('<a href="#" onclick="DoEdit(descr);">Click Me</a>');       
});

function DoEdit(desc)
{
    alert ( desc );
}

और यह Internet Explorer और Firefox में काम करता है।


5
बेशक यह करता है, क्योंकि आप इसे सीधे विशेषता में नहीं डाल रहे हैं। अपनी विधि का उपयोग करने के लिए, मुझे JS स्ट्रिंग्स की एक सरणी बनानी होगी, फिर एक मनमाना नंबर $ ("# divxxx") ... असाइनमेंट करें। इष्टतम से कम, लेकिन सुझाव के लिए धन्यवाद।
मैट डावी

1

आप उन दो कार्यों (नीचे सूचीबद्ध) की प्रतिलिपि बना सकते हैं, और सभी उद्धरणों और विशेष वर्णों से बचने / अनस्केप करने के लिए उनका उपयोग कर सकते हैं। आपको इसके लिए jQuery या किसी अन्य लाइब्रेरी का उपयोग करने की आवश्यकता नहीं है।

function escape(s) {
    return ('' + s)
        .replace(/\\/g, '\\\\')
        .replace(/\t/g, '\\t')
        .replace(/\n/g, '\\n')
        .replace(/\u00A0/g, '\\u00A0')
        .replace(/&/g, '\\x26')
        .replace(/'/g, '\\x27')
        .replace(/"/g, '\\x22')
        .replace(/</g, '\\x3C')
        .replace(/>/g, '\\x3E');
}

function unescape(s) {
    s = ('' + s)
       .replace(/\\x3E/g, '>')
       .replace(/\\x3C/g, '<')
       .replace(/\\x22/g, '"')
       .replace(/\\x27/g, "'")
       .replace(/\\x26/g, '&')
       .replace(/\\u00A0/g, '\u00A0')
       .replace(/\\n/g, '\n')
       .replace(/\\t/g, '\t');

    return s.replace(/\\\\/g, '\\');
}

1

कृपया नीचे दिए गए कोड में खोजें जो एक नियमित अभिव्यक्ति का उपयोग करके दर्ज किए गए स्ट्रिंग के हिस्से के रूप में एकल उद्धरण से बच जाता है। यह पुष्टि करता है कि उपयोगकर्ता द्वारा दर्ज किया गया स्ट्रिंग अल्पविराम से अलग है और एक ही समय में यह स्ट्रिंग के हिस्से के रूप में दर्ज किए गए किसी भी एक उद्धरण से बच जाता है।

एकल उद्धरण से बचने के लिए, बस एक पिछड़े स्लैश में प्रवेश करें, जिसके बाद एक स्ट्रिंग जैसे: \ ' स्ट्रिंग के भाग के रूप में। मैंने इस उदाहरण के लिए jQuery सत्यापनकर्ता का उपयोग किया है, और आप अपनी सुविधा के अनुसार उपयोग कर सकते हैं।

मान्य स्ट्रिंग उदाहरण:

'हैलो'

'नमस्ते दुनिया'

'नमस्ते दुनिया'

'नमस्ते दुनिया',' '

'इट्स माई वर्ल्ड', 'कैन' 'टी एन्जॉय दिस विदाउट मी।', 'वेलकम, गेस्ट'

HTML:

<tr>
    <td>
        <label class="control-label">
            String Field:
        </label>
        <div class="inner-addon right-addon">
            <input type="text" id="stringField"
                   name="stringField"
                   class="form-control"
                   autocomplete="off"
                   data-rule-required="true"
                   data-msg-required="Cannot be blank."
                   data-rule-commaSeparatedText="true"
                   data-msg-commaSeparatedText="Invalid comma separated value(s).">
        </div>
    </td>

जावास्क्रिप्ट:

     /**
 *
 * @param {type} param1
 * @param {type} param2
 * @param {type} param3
 */
jQuery.validator.addMethod('commaSeparatedText', function(value, element) {

    if (value.length === 0) {
        return true;
    }
    var expression = new RegExp("^((')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))(((,)|(,\\s))(')([^\'\\\\]*(?:\\\\.[^\'\\\\])*)[\\w\\s,\\.\\-_\\[\\]\\)\\(]+([^\'\\\\]*(?:\\\\.[^\'\\\\])*)('))*$");
    return expression.test(value);
}, 'Invalid comma separated string values.');

0

साथ ही व्हॉट्सएप से बच जाएं। यह मुझे लगता है जैसे फ़ायरफ़ॉक्स एक के बजाय तीन तर्क मान रहा है। &nbsp;नॉन-ब्रेकिंग स्पेस कैरेक्टर है। यहां तक ​​कि अगर यह पूरी समस्या नहीं है, तब भी यह एक अच्छा विचार हो सकता है।


0

आपको डबल बैकस्लैश वाले उद्धरणों से बचने की आवश्यकता है।

यह विफल रहता है (PHP के json_encode द्वारा निर्मित ):

<script>
  var jsonString = '[{"key":"my \"value\" "}]';
  var parsedJson = JSON.parse(jsonString);
</script>

यह काम:

<script>
  var jsonString = '[{"key":"my \\"value\\" "}]';
  var parsedJson = JSON.parse(jsonString);
</script>

0

आप भागने () और अनस्केप () jQuery के तरीकों का उपयोग कर सकते हैं। नीचे की तरह,

का प्रयोग करें escape(str);स्ट्रिंग से बचने और का उपयोग कर फिर से ठीक करने के लिए unescape(str_esc);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.