টেক্সেরিয়া থেকে পাঠ্য পাওয়ার সময় আমি কীভাবে লাইন ব্রেকগুলি সংরক্ষণ করব?


96

যখন ব্যবহারকারী সাবমিট হিট করে আমি একটি টেক্সারিয়ায় মান পাচ্ছি। আমি তখন এই মানটি নিয়ে এটি পৃষ্ঠায় অন্যত্র রাখি। যাইহোক, আমি যখন এটি করি তখন এটি আউটপুটটিকে বেশ কুরুচিপূর্ণ করে তোলে নতুন লাইন অক্ষরগুলি হারায়।

আমি যে টেক্সারিয়াটি অ্যাক্সেস করছি তা এখানে:

<textarea id="post-text" class="form-control" rows="3" placeholder="What's up?" required></textarea>

এখানে জাভাস্ক্রিপ্ট কোডটি পোস্টটিতে অ্যাক্সেস করা এবং এটিকে প্রতিলিপি করা হয়েছে।

var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.append(postText);
var card = document.createElement('div');
card.append(post);
var cardStack = document.getElementById('#card-stack');
cardStack.prepend(card);

যখন ইনপুটটি এমন কিছু হয়:

গোষ্ঠী সূচি:

মঙ্গলবার অনুশীলন @ 5 তম (রাত 8 টা - 11 টা)

বৃহস্পতিবার অনুশীলন @ 5 তম (রাত 8 টা - 11 টা)

রবিবার অনুশীলন @ (রাত 9 টা - 12 টা)

আউটপুটটি হ'ল:

গ্রুপের সময়সূচি: মঙ্গলবার অনুশীলন @ 5 তম (রাত 8 টা - 11 টা) বৃহস্পতিবার অনুশীলন @ 5 তম (রাত 8 টা - 11 টা) রবিবার অনুশীলন @ (রাত 9 টা - 12 টা)

সুতরাং লাইন বিরতি সংরক্ষণ করার উপায় আছে?


4
আপনি যদি jQuery ব্যবহার করার অনুমতি পান তবে এটি আপনাকে সহায়তা করতে পারে: অনুলিপি-থেকে-টেক্সারিয়া-থেকে-ডিভি-সংরক্ষণ-লাইনব্রেকগুলি বিকল্পভাবে এটি লাইন-ব্রেক-ইন-
টেক্সেরিয়া

4
লাইন বিরতি আসলে সংরক্ষণ করা হয়, পাঠ্যটি প্রদর্শন করার সময় লক্ষ্য উপাদানটি তাদের উপেক্ষা করার জন্য কেবল সেট করা থাকে তবে আপনি যদি এটি পরীক্ষা করেন তবে আপনি দেখতে পাবেন যে তারা এখানে রয়েছে। স্টেফানোর উত্তরটি কেবল তাদের লক্ষ্যমাত্রা নির্ধারণ করে আর এড়িয়ে চলবে না, সম্ভবত যাওয়ার সবচেয়ে ভাল উপায়।
spectras

4
নিতপিকের জন্য দুঃখিত, তবে getElementById২ য়-শেষ-লাইনটি কোথায় থাকবে? আমি ধরে নিচ্ছি আপনি অন্য কোথাও এটি সংজ্ঞায়িত করেছেন বা আপনি এটি ভুলে গেছেন document
ট্রাইসিস

উত্তর:


175

সবচেয়ে সহজ সমাধানটি হ'ল নীচের CSS বৈশিষ্ট্য সহ আপনি যে উপাদানটি প্রবেশ করিয়ে দিচ্ছেন সেটি স্টাইল করা:

white-space: pre-wrap;

এই বৈশিষ্ট্যটির সাথে মিলের উপাদানগুলির মধ্যে শ্বেত স্থান এবং নিউলাইনগুলি এ এর ​​অভ্যন্তরের মতো একইরকম আচরণ করা হয় <textarea>। অর্থাত্, পর পরের শ্বেত স্থানটি ধসে পড়ে না, এবং লাইনগুলি স্পষ্টত নিউলাইনগুলিতে ভাঙা হয় (তবে তারা যদি উপাদানটির প্রস্থের বেশি হয় তবে স্বয়ংক্রিয়ভাবে মোড়ানো হবে)।

এখন পর্যন্ত এখানে পোস্ট করা বেশ কয়েকটি উত্তর এইচটিএমএল ইনজেকশনের ঝুঁকির মধ্যে রয়েছে (যেমন তারা অনস্কেপযুক্ত ব্যবহারকারীদের ইনপুট দেয় innerHTML) বা অন্যথায় বগি, আপনার আসল কোডের ভিত্তিতে কীভাবে নিরাপদে এবং সঠিকভাবে এটি করা যায় তার একটি উদাহরণ দেই:


মনে রাখবেন, আপনার মূল কোডের মতো, উপরের স্নিপেট ব্যবহার করে append()এবং prepend()। এই লেখার হিসাবে, সেই ফাংশনগুলি এখনও পরীক্ষামূলক হিসাবে বিবেচিত হয় এবং সমস্ত ব্রাউজার দ্বারা পুরোপুরি সমর্থিত হয় না। আপনি যদি নিরাপদে থাকতে চান এবং পুরানো ব্রাউজারগুলির সাথে সামঞ্জস্য বজায় রাখতে চান তবে আপনি নীচের মতো খুব সহজেই এগুলি প্রতিস্থাপন করতে পারেন:

  • element.append(otherElement)সঙ্গে প্রতিস্থাপন করা যেতে পারে element.appendChild(otherElement);
  • element.prepend(otherElement)সঙ্গে প্রতিস্থাপন করা যেতে পারে element.insertBefore(otherElement, element.firstChild);
  • element.append(stringOfText)সঙ্গে প্রতিস্থাপন করা যেতে পারে element.appendChild(document.createTextNode(stringOfText));
  • element.prepend(stringOfText)সঙ্গে প্রতিস্থাপন করা যেতে পারে element.insertBefore(document.createTextNode(stringOfText), element.firstChild);
  • বিশেষ স্থান ধার্য, যদি elementখালি থাকে, উভয় element.append(stringOfText)এবং element.prepend(stringOfText)কেবল সঙ্গে প্রতিস্থাপিত হতে পারে element.textContent = stringOfText

এখানে উপরে যেমন স্নিপেট রয়েছে তবে ব্যবহার না করে append()বা prepend():


পুনশ্চ. আপনি যদি সিএসএস সম্পত্তি ব্যবহার না করে সত্যিই এটি করতে চান white-space, তবে বিকল্প বিকল্প হ'ল <br>এইচটিএমএল ট্যাগের সাহায্যে পাঠ্যের কোনও নতুন লাইন অক্ষর স্পষ্টভাবে প্রতিস্থাপন করা হবে । জটিল অংশটি হ'ল, সূক্ষ্ম বাগ এবং সম্ভাব্য সুরক্ষা গর্তগুলি প্রবর্তন এড়াতে, আপনাকে এই প্রতিস্থাপনটি করার আগে আপনাকে প্রথমে কোনও HTML মেটাক্রে্যাক্টরগুলি (কমপক্ষে &এবং কমপক্ষে <) পাঠাতে হবে।

সম্ভবত এটির সবচেয়ে সহজ এবং নিরাপদ উপায় ব্রাউজারটি আপনার জন্য এইচটিএমএল-পলায়ন পরিচালনা করতে দেয়, যেমন:

var post = document.createElement('p');
post.textContent = postText;
post.innerHTML = post.innerHTML.replace(/\n/g, '<br>\n');

মনে রাখবেন, এটি লাইন ব্রেকগুলি ঠিক করবে, ততক্ষণে এটি এইচটিএমএল রেন্ডারারের দ্বারা ধীরে ধীরে হোয়াইটস্পেসকে ধসে পড়তে বাধা দেবে না। (সাজানোর) অনুকরণ করা সম্ভব যে পাঠ্যের কিছু শ্বেতস্পেসকে অ-ব্রেকিং স্পেসে প্রতিস্থাপনের মাধ্যমে, তবে সত্যই, এটি এমন কোনও সমস্যার জন্য জটিল হয়ে উঠছে যা সিএসএসের একক লাইন দিয়ে তুচ্ছভাবে সমাধান করা যায়।


4
এটি সবচেয়ে ব্যাপক উত্তর বলে মনে হচ্ছে। কেন এটি ভোট দেওয়া হচ্ছে? এটিতে যদি ভুল তথ্য থাকে তবে দয়া করে ভাগ করুন।
ইথান ভ্যান্ডার হর্ন

4
হোয়াইট স্পেস: প্রি-লাইনে প্রথম লাইনে ইন্ডেনশন ছিল বলে আমার পক্ষে প্রাক-লাইন কাজ করেছিল।
dev4 Life 19

4
ধন্যবাদ দোস্ত. আপনি আমার দিনটি তৈরি করেছেন
thatman

সুতরাং জিনিসটি হ'ল আমি টেক্সট এরিয়াতে শ্বেত স্পেসগুলি দেখতে সক্ষম হয়েছি, তবে আমি যখন এপিআই প্রান্তে এগুলি গ্রহণ করি এবং সেগুলি একটি ইমেলের মাধ্যমে প্রেরণ করা হয়, এটি স্পেসগুলি সংরক্ষণ করে না।
অপূর্ব কুঙ্কুলল

@ অপূর্বকুনকুল: এটি আপনার সার্ভার-সাইড কোডে সমস্যা বলে মনে হচ্ছে। আপনি এটি সম্পর্কে একটি নতুন প্রশ্ন জিজ্ঞাসা করতে পারেন, তবে আপনাকে সমস্যাটি দেখায় এমন একটি ন্যূনতম পুনরুত্পাদনযোগ্য উদাহরণ সরবরাহ করতে হবে।
ইলমারি করোনেন

23

লক্ষ্য পাত্রে white-space:preস্টাইল থাকা উচিত । এটি নীচে চেষ্টা করুন।

<script>
function copycontent(){
 var content = document.getElementById('ta').value;
 document.getElementById('target').innerText = content;
}
</script>
<textarea id='ta' rows='3'>
  line 1
  line 2
  line 3
</textarea>
<button id='btn' onclick='copycontent();'>
Copy
</button>
<p id='target' style='white-space:pre'>

</p>


10
pre-wrapবা pre-lineআরও ভাল হবে। preলাইন মোড়ানো বাধা দেয় তাই পাঠ্যের একটি দীর্ঘ দীর্ঘ রেখা অনুভূমিক স্ক্রোলবারকে বাধ্য করবে।
সালমান এ

10
এই কোডটি এইচটিএমএল ইনজেকশনের পক্ষে ঝুঁকিপূর্ণ, কারণ আপনি অনস্কেপড ব্যবহারকারীর ইনপুট নিযুক্ত করছেন innerHTML। এই ক্ষেত্রে, কেবল এর সাথে প্রতিস্থাপন innerHTMLকরা textContentএটি ঠিক করবে।
ইলমারি করোনেন

4
পছন্দ করুন আপনার সেট করা দরকার innerText এবং textContent । কেবল textContentসেটিংটি আইই (কোনও সংস্করণ) এ কাজ করবে না এবং কেবল সেটিং innerTextভবিষ্যতে ক্রোমে কাজ করবে না এবং ফায়ারফক্সে কাজ করবে না।
ইসমাইল মিগুয়েল

4
@ ইসমাইল মিগুয়েল: এটি আশ্চর্যজনক - আমি এটি আইই 11 থেকে পোস্ট করছি এবং এটি এখানে ঠিক কাজ করে। স্পষ্টতই আইই textContentসংস্করণ 9 এর পরে সমর্থন করেছে
ইলমারি করোনেন

4
@ ইলমারি কারোনেন এটি অদ্ভুত ... আমি এটি সম্পর্কে অবগত ছিলাম না। তবে innerTextআপনার যদি আইই 8 দরকার হয় তবে এটি অন্তর্ভুক্ত করা ভাল ধারণা ।
ইসমাইল মিগুয়েল

7

function get() {
  var arrayOfRows = document.getElementById("ta").value.split("\n");
  var docfrag = document.createDocumentFragment();
  
  var p = document.getElementById("result");
  while (p.firstChild) {
    p.removeChild(p.firstChild);
  }
  
  arrayOfRows.forEach(function(row, index, array) {
    var span = document.createElement("span");
    span.textContent = row;
    docfrag.appendChild(span);
    if(index < array.length - 1) {
      docfrag.appendChild(document.createElement("br"));
    }
  });

  p.appendChild(docfrag);
}
<textarea id="ta" rows=3></textarea><br>
<button onclick="get()">get</button>
<p id="result"></p>

আপনি টেক্সারিয়া সারিগুলিকে অ্যারেতে বিভক্ত করতে পারেন:

var arrayOfRows = postText.value.split("\n");

তারপরে এটি তৈরি করতে ব্যবহার করুন, সম্ভবত, আরও পি ট্যাগ ...


4
@ ইলমারিকারনেন যা বলেছিলেন: এই কোডটি ভুল কারণ আপনি textarea.valueএইচটিএমএল ( innerHTML) প্রত্যাশা করে এমন কোনও সম্পত্তিতে প্লেইন টেক্সট ( ) বরাদ্দ করছেন । এটি এমন একটি ত্রুটি যা ভাঙা পাঠ্য থেকে শুরু করে সুরক্ষা গর্ত পর্যন্ত সমস্যা সৃষ্টি করে। ব্যবহারের পরিবর্তে innerHTML, আপনি এবং এর appendChildসাথে করতে পারেন । document.createTextNode(text)document.createElement('br')
Kos

4
আরও কার্যকর করার একটি ভাল উপায় document.createDocumentFragment
Kos

4
@ ইলমারিকারোনেন, কোস, এটি সুরক্ষা বা কমনীয়তা নিয়ে প্রশ্ন ছিল না। যদিও আমি এটি অপ্টিমাইজ করেছি।
কলিদি

4
@ মিশার: ওপি লাইন ব্রেকগুলি সংরক্ষণ করার উপায় চেয়েছিল, লাইন ব্রেকগুলি সংরক্ষণ করার এবং এইচটিএমএল ইঞ্জেকশন দেওয়ার অনুমতি দেওয়ার জন্য নয়। আপনি যখন কোনও ইউআই বাগ ঠিক করার জন্য সাহায্যের জন্য জিজ্ঞাসা করেন তখন একটি নিখরচায় সুরক্ষা গর্ত প্রাপ্তি হ্যামবার্গারের জন্য জিজ্ঞাসা করার সময় প্যাটিটিতে একটি বিনামূল্যে থাম্বট্যাক পাওয়ার মতো is যাইহোক, যেহেতু আপনার "অনুকূলিত" কোডটি আর অরক্ষিত বলে মনে হচ্ছে না, তাই আমি আমার ডাউনটোটটি সরিয়েছি।
ইলমারি করোনেন

3

পাঠ্যবক্সে আপনার একাধিক নতুন লাইন থাকতে পারে বলে এখানে একটি ধারণা দেওয়া হল:

 var text=document.getElementById('post-text').value.split('\n');
 var html = text.join('<br />');

এই এইচটিএমএল মানটি নিউলাইন সংরক্ষণ করবে। আশাকরি এটা সাহায্য করবে.


4
এটি অনস্কেপড ব্যবহারকারী ইনপুট এবং এইচটিএমএল ট্যাগগুলির একটি মিশ্রণও তৈরি করবে, যা এইচটিএমএল ইনজেকশন দুর্বলতা তৈরি করে যদি ফলস্বরূপ htmlস্ট্রিংটি আসলে এইচটিএমএল হিসাবে রেন্ডার করা হয়।
ইলমারি করোনেন

@ ইলমারিকারনেন - সুতরাং আপনার উদ্বেগটি হল যে কেউ নিজেরাই আক্রমণ করতে পারে? ওপিতে কোনও ধরণের ডাটাবেস সম্পর্কে উল্লেখ করা হয়নি। একজন ব্যবহারকারী ইনপুট কীভাবে অন্য ব্যবহারকারীর উপর প্রভাব ফেলবে? হতে পারে এটি এমন কিছু যা কেবলমাত্র ওপি চোখের জন্য এবং 0 টি স্যানিটেশন প্রয়োজন (এটি এমনকি যদি এটির কোনও প্রয়োজনও থাকে)।
জেসি

4
@ জেসি: সাধারণভাবে এটি নিশ্চিত হওয়া শক্ত যে ব্যবহারকারী ইনপুটটি কোনও বিশ্বস্ত উত্স থেকে এসেছে। এমনকি যদি কোনও আক্রমণকারী টেক্সটরিয়ায় সরাসরি টেক্সট ইনজেক্ট করার কোনও উপায় না থাকে তবে প্রচুর সোশ্যাল মিডিয়া ভাইরাস রয়েছে যা ছড়িয়ে পড়েছে সামাজিক প্রকৌশল মাধ্যমে দুর্বল ব্যবহারকারীদের কিছু অনিচ্ছুক প্রবেশের ক্ষেত্রে অনুলিপি করার জন্য। এছাড়াও, যদি ইনপুটটি সত্যই 100% বিশ্বাস করা যায় তবে এই কোডটি এখনও এমন কোনও পাঠ্যকে ম্যানগল করে যা এইচটিএমএল মেটাচার্যাক্টারের মতো &বা থাকে <। এমনকি যদি সুরক্ষা কোনও উদ্বেগ না হয় তবে এটি এখনও একটি বাগ।
ইলমারি করোনেন

@ ইলমারি কারোনেন - আমি কোনও আক্রমণ সম্পর্কে মোটেই উদ্বিগ্ন নই তবে এই তথ্যের জন্য আপনাকে ধন্যবাদ!
ইথান ভ্যান্ডার হর্ন

3

আপনি widthজাভাস্ক্রিপ্ট ব্যবহার করে ডিভ সেট করতে এবং যুক্ত white-space:pre-wrapকরতে পারেন p tag, এটি প্রতিটি লাইনের শেষে আপনার টেক্সারিয়া সামগ্রীটি ভেঙে দেয়।

document.querySelector("button").onclick = function gt(){
var card = document.createElement('div');
card.style.width = "160px";
card.style.background = "#eee";
var post = document.createElement('p');
var postText = document.getElementById('post-text').value;
post.style.whiteSpace = "pre-wrap";
card.append(post);
post.append(postText);
document.body.append(card);
}
<textarea id="post-text" class="form-control" rows="3" placeholder="What's up?" required>
Group Schedule:

Tuesday practice @ 5th floor (8pm - 11 pm)

Thursday practice @ 5th floor (8pm - 11 pm)

Sunday practice @ (9pm - 12 am)</textarea>
<br><br>
<button>Copy!!</button>


3

আমি মনে করি আপনি চান না যে আপনার পাঠ্য-সামগ্রীটি এইচটিএমএল হিসাবে পার্স করা উচিত। এই ক্ষেত্রে, আপনি এটি কেবল প্লেইন টেক্সট হিসাবে সেট করতে পারেন যাতে ব্রাউজার এটি HTML হিসাবে বিবেচনা করে না এবং নতুন লাইনগুলি কোনও সিএসএস বা প্রিপ্রোসেসিং প্রয়োজন হয় না।

<script>
function copycontent(){
 var content = document.getElementById('ta').value;
 document.getElementById('target').innerText = content;
}
</script>
<textarea id='ta' rows='3'>
  line 1
  line 2
  line 3
</textarea>
<button id='btn' onclick='copycontent();'>
Copy
</button>
<p id='target'></p>


2

অনুরূপ প্রশ্ন এখানে

একটি পাঠ্য ক্ষেত্রের ইনপুটটিতে লাইন বিরতি সনাক্ত করুন

পাঠ্যরেখায় লাইন বিরতি সনাক্ত করুন

আপনি এটি চেষ্টা করতে পারেন:

var submit = document.getElementById('submit');

submit.addEventListener('click', function(){
var textContent = document.querySelector('textarea').value;
  
document.getElementById('output').innerHTML = textContent.replace(/\n/g, '<br/>');
  

});
<textarea cols=30 rows=10 >This is some text
this is another text

Another text again and again</textarea>
<input type='submit' id='submit'>


<p id='output'></p>

document.querySelector('textarea').value;টেক্সটরিয়ার পাঠ্য সামগ্রী পাবেন এবং সামগ্রীতে textContent.replace(/\n/g, '<br/>')সোর্স কোডের সমস্ত নিউলাইন অক্ষর খুঁজে পাবেন /\n/gএবং এটি এইচটিএমএল লাইন-ব্রেকের সাথে প্রতিস্থাপন করবেন <br/>


আরেকটি বিকল্প হ'ল এইচটিএমএল <pre> ট্যাগ ব্যবহার করানীচে ডেমো দেখুন

var submit = document.getElementById('submit');

submit.addEventListener('click', function(){

  var content = '<pre>';
  
  var textContent = document.querySelector('textarea').value;
  
  content += textContent;
  
  content += '</pre>';

  document.getElementById('output').innerHTML = content;

});
<textarea cols=30 rows=10>This is some text
this is another text

Another text again and again </textarea>
<input type='submit' id='submit'>

<div id='output'> </div>


4
প্রশ্নটি আবার পড়ুন। পোস্টারে অন্য পৃষ্ঠার ভিতরে নয়, কোনও পৃষ্ঠায় টেক্সারিয়া থেকে পাঠ্য পাঠানোর সময় কীভাবে লাইন ব্রেকগুলি সংরক্ষণ করা যায় তা জিজ্ঞাসা করছে।
জেসি

4
আপনার প্রথম উদাহরণটি বগি এবং কার্যকর হয় না। (আপনি কোনও textContent.replace()কিছুর ফলাফল এমনকি কখনও বরাদ্দও করেন না )) আপনার দ্বিতীয় উদাহরণটি এইচটিএমএল ইনজেকশন বাগের জন্য বেশ কয়েকটি অন্যান্য উত্তর হিসাবে ঝুঁকিপূর্ণ, কারণ আপনি অনস্কেপড ব্যবহারকারীর ইনপুট বরাদ্দ করছেন innerHTML(এবং আপনি প্রথম উদাহরণটি সমান ঝুঁকিপূর্ণ হবেন, যদি আপনি চেষ্টা করেন তবে replace()কল আউটপুট সঙ্গে আসলে দরকারী কিছু করতে )।
ইলমারি করোনেন

ধন্যবাদ! আউটলুক 2013 আসলে জানেন <<> কী
ব্যবহারকারী 1566694
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.