मैं jQuery कुछ textarea सामग्री ले रहा हूँ और एक ली में डाल रहा हूँ।
मैं चाहता हूं कि यह लाइन ब्रेक को नेत्रहीन बनाए रखे।
ऐसा करने का एक बहुत ही सरल तरीका होना चाहिए ...
मैं jQuery कुछ textarea सामग्री ले रहा हूँ और एक ली में डाल रहा हूँ।
मैं चाहता हूं कि यह लाइन ब्रेक को नेत्रहीन बनाए रखे।
ऐसा करने का एक बहुत ही सरल तरीका होना चाहिए ...
जवाबों:
डेमो: http://so.devilmaycode.it/jquery-convert-line-breaks-to-br-nl2br-equivalent
function nl2br (str, is_xhtml) {
var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
}
आप बस कर सकते हैं:
textAreaContent=textAreaContent.replace(/\n/g,"<br>");
सामग्री को बदलने के बजाय रेंडरिंग बदलने की भावना में , निम्नलिखित सीएसएस प्रत्येक नई पंक्ति का व्यवहार करता है :<br>
white-space: pre;
white-space: pre-line;
दो नियम क्यों: pre-line
केवल नई सूचियों को प्रभावित करते हैं (सुराग के लिए धन्यवाद, @ क्वीनपौली)। IE6-7 और अन्य पुराने ब्राउज़र अधिक चरम पर वापस आते हैं pre
जिसमें nowrap
कई रिक्त स्थान भी शामिल हैं और प्रदान करते हैं। इन और अन्य सेटिंग्स ( pre-wrap
) पर मोज़िला और सीएसएस-ट्रिक (विवरण @Sablefoste) पर विवरण।
जबकि मैं आम तौर पर इसका उत्तर देने के बजाय प्रश्न का अनुमान लगाने के लिए एसओ पूर्वनिर्धारण का विरोध करता हूं , इस मामले में <br>
मार्कअप के साथ नए सिरे से प्रतिस्थापित करने से अनजाने उपयोगकर्ता इनपुट के साथ इंजेक्शन हमले के लिए भेद्यता बढ़ सकती है । जब भी आप स्वयं को .text()
कॉलिंग बदलते हुए देखते हैं कि आप एक चमकदार लाल रेखा को पार कर रहे हैं .html()
, तो शाब्दिक प्रश्न का अर्थ है। (इस बिंदु को उजागर करने के लिए @AlexS धन्यवाद।) भले ही आप समय पर सुरक्षा जोखिम से इनकार करते हैं, लेकिन भविष्य में होने वाले बदलाव इसे शुरू नहीं कर सकते। इसके बजाय, यह CSS आपको सुरक्षित का उपयोग करके मार्कअप के बिना हार्ड लाइन ब्रेक प्राप्त करने की अनुमति देता है .text()
।
white-space:
विकल्पों में से किसी पर भी विचार कर सकते हैं, जैसे कि pre-wrap
। देखें css-tricks.com/almanac/properties/w/whitespace
.html()
सामग्री को सेट करने के लिए उपयोग करने की आवश्यकता है, जो बदले में उपयोगकर्ता को मनमाने ढंग से HTML सम्मिलित करने की अनुमति देगा जब तक कि आप पहले से फ़िल्टर न करें।
.html()
खतरे के बारे में अच्छी बात @AlexS, को शामिल करने की कोशिश की।
उपाय
इस कोड का उपयोग करें
jQuery.nl2br = function(varTest){
return varTest.replace(/(\r\n|\n\r|\r|\n)/g, "<br>");
};
यह जावास्क्रिप्ट फ़ंक्शन समझता है कि स्वैप को संभालने के लिए सम्मिलित करें या प्रतिस्थापित करें।
(HTML लाइन ब्रेक डालें या बदलें)
/**
* This function is same as PHP's nl2br() with default parameters.
*
* @param {string} str Input text
* @param {boolean} replaceMode Use replace instead of insert
* @param {boolean} isXhtml Use XHTML
* @return {string} Filtered text
*/
function nl2br (str, replaceMode, isXhtml) {
var breakTag = (isXhtml) ? '<br />' : '<br>';
var replaceStr = (replaceMode) ? '$1'+ breakTag : '$1'+ breakTag +'$2';
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, replaceStr);
}
मैंने इसके लिए थोड़ा jQuery एक्सटेंशन लिखा:
$.fn.nl2brText = function (sText) {
var bReturnValue = 'undefined' == typeof sText;
if(bReturnValue) {
sText = $('<pre>').html(this.html().replace(/<br[^>]*>/i, '\n')).text();
}
var aElms = [];
sText.split(/\r\n|\r|\n/).forEach(function(sSubstring) {
if(aElms.length) {
aElms.push(document.createElement('br'));
}
aElms.push(document.createTextNode(sSubstring));
});
var $aElms = $(aElms);
if(bReturnValue) {
return $aElms;
}
return this.empty().append($aElms);
};
DOM को लाइन ब्रेक रखते हुए textarea से टेक्स्ट डालने का एक और तरीका है नोड और उसके वंशजों के रेंडर किए गए टेक्स्ट कंटेंट को दर्शाने वाली Node.innerText प्रॉपर्टी का इस्तेमाल करना ।
एक गेटर के रूप में, यह पाठ को यह अनुमान लगाता है कि उपयोगकर्ता को कर्सर के साथ तत्व की सामग्री पर प्रकाश डाला जाएगा और फिर क्लिपबोर्ड पर कॉपी किया जाएगा।
संपत्ति 2016 में मानक बन गई और आधुनिक ब्राउज़रों द्वारा अच्छी तरह से समर्थित है। क्या मैं उपयोग कर सकता हूं : 97% वैश्विक कवरेज जब मैंने यह उत्तर पोस्ट किया।