Obtengo el valor en un área de texto cuando el usuario presiona enviar. Luego tomo este valor y lo coloco en otra parte de la página. Sin embargo, cuando hago esto, pierde caracteres de nueva línea, lo que hace que el resultado sea bastante feo.
Aquí está el área de texto al que estoy accediendo:
<textarea id="post-text" class="form-control" rows="3" placeholder="What's up?" required></textarea>
Aquí está el código JavaScript que accede a la publicación y la transcribe.
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);
Cuando la entrada es algo como:
Horario de grupo:
Práctica del martes en el quinto piso (8 pm - 11 pm)
Práctica del jueves en el quinto piso (8 pm - 11 pm)
Práctica dominical @ (9 pm - 12 am)
La salida es:
Horario grupal: práctica del martes en el quinto piso (8 p.m. a 11 p.m.) práctica del jueves en el quinto piso (8 p.m. a 11 p.m.) práctica del domingo (9 p.m. a 12 a.m.)
Entonces, ¿hay alguna forma de preservar los saltos de línea?
fuente
getElementById
función en la segunda a la última línea? Supongo que lo definió en otro lugar o que olvidó eldocument
.Respuestas:
La solución más fácil es simplemente diseñar el elemento en el que está insertando el texto con la siguiente propiedad CSS:
white-space: pre-wrap;
Esta propiedad hace que los espacios en blanco y las nuevas líneas dentro de los elementos coincidentes se traten de la misma manera que dentro de a
<textarea>
. Es decir, los espacios en blanco consecutivos no se contraen y las líneas se rompen en nuevas líneas explícitas (pero también se ajustan automáticamente si exceden el ancho del elemento).Dado que varias de las respuestas publicadas aquí hasta ahora han sido vulnerables a la inyección de HTML (por ejemplo, porque asignan una entrada de usuario sin escape
innerHTML
) o tienen errores, permítanme dar un ejemplo de cómo hacer esto de manera segura y correcta, según su código original:Mostrar fragmento de código
document.getElementById('post-button').addEventListener('click', function () { 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); });
#card-stack p { background: #ddd; white-space: pre-wrap; /* <-- THIS PRESERVES THE LINE BREAKS */ } textarea { width: 100%; }
<textarea id="post-text" class="form-control" rows="8" 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> <input type="button" id="post-button" value="Post!"> <div id="card-stack"></div>
Tenga en cuenta que, al igual que su código original, el fragmento anterior usa
append()
yprepend()
. En el momento de escribir este artículo, esas funciones todavía se consideran experimentales y no son totalmente compatibles con todos los navegadores. Si desea estar seguro y seguir siendo compatible con navegadores más antiguos, puede sustituirlos con bastante facilidad de la siguiente manera:element.append(otherElement)
se puede reemplazar conelement.appendChild(otherElement)
;element.prepend(otherElement)
se puede reemplazar conelement.insertBefore(otherElement, element.firstChild)
;element.append(stringOfText)
se puede reemplazar conelement.appendChild(document.createTextNode(stringOfText))
;element.prepend(stringOfText)
se puede reemplazar conelement.insertBefore(document.createTextNode(stringOfText), element.firstChild)
;element
está vacío, amboselement.append(stringOfText)
yelement.prepend(stringOfText)
simplemente se pueden reemplazar conelement.textContent = stringOfText
.Este es el mismo fragmento que el anterior, pero sin usar
append()
oprepend()
:Mostrar fragmento de código
document.getElementById('post-button').addEventListener('click', function () { var post = document.createElement('p'); var postText = document.getElementById('post-text').value; post.textContent = postText; var card = document.createElement('div'); card.appendChild(post); var cardStack = document.getElementById('card-stack'); cardStack.insertBefore(card, cardStack.firstChild); });
#card-stack p { background: #ddd; white-space: pre-wrap; /* <-- THIS PRESERVES THE LINE BREAKS */ } textarea { width: 100%; }
<textarea id="post-text" class="form-control" rows="8" 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> <input type="button" id="post-button" value="Post!"> <div id="card-stack"></div>
PD. Si realmente desea hacer esto sin usar la
white-space
propiedad CSS , una solución alternativa sería reemplazar explícitamente cualquier carácter de nueva línea en el texto con<br>
etiquetas HTML. La parte difícil es que, para evitar la introducción de errores sutiles y agujeros de seguridad potenciales, usted tiene que escapar primero cualquier meta HTML (como mínimo,&
y<
) en el texto antes de hacer esto reemplazo.Probablemente la forma más sencilla y segura de hacerlo es dejar que el navegador maneje el escape HTML por usted, así:
var post = document.createElement('p'); post.textContent = postText; post.innerHTML = post.innerHTML.replace(/\n/g, '<br>\n');
Mostrar fragmento de código
document.getElementById('post-button').addEventListener('click', function () { var post = document.createElement('p'); var postText = document.getElementById('post-text').value; post.textContent = postText; post.innerHTML = post.innerHTML.replace(/\n/g, '<br>\n'); // <-- THIS FIXES THE LINE BREAKS var card = document.createElement('div'); card.appendChild(post); var cardStack = document.getElementById('card-stack'); cardStack.insertBefore(card, cardStack.firstChild); });
#card-stack p { background: #ddd; } textarea { width: 100%; }
<textarea id="post-text" class="form-control" rows="8" 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> <input type="button" id="post-button" value="Post!"> <div id="card-stack"></div>
Tenga en cuenta que, aunque esto arreglará los saltos de línea, no evitará que el renderizador HTML colapse espacios en blanco consecutivos. Es posible (más o menos) emular eso reemplazando algunos de los espacios en blanco en el texto con espacios que no se rompan, pero honestamente, eso se está volviendo bastante complicado para algo que se puede resolver trivialmente con una sola línea de CSS.
fuente
El contenedor de destino debe tener el
white-space:pre
estilo. Pruébelo a continuación.<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>
fuente
pre-wrap
opre-line
sería mejor.pre
evita el ajuste de línea, por lo que una línea de texto muy larga forzará la barra de desplazamiento horizontal.innerHTML
. En este caso, simplemente reemplazarloinnerHTML
contextContent
lo solucionaría.innerText
ytextContent
. La configuración solotextContent
no funcionará en IE (cualquier versión) y la configuración soloinnerText
puede no funcionar en Chrome en el futuro y no funcionará en Firefox.textContent
desde la versión 9.innerText
si necesita IE8.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>
Puede dividir filas de área de texto en una matriz:
var arrayOfRows = postText.value.split("\n");
Luego úselo para generar, tal vez, más etiquetas p ...
fuente
textarea.value
) a una propiedad que espera HTML (innerHTML
). Este es un tipo de error que causa problemas que van desde texto roto hasta agujeros de seguridad. En lugar de usarinnerHTML
, puede hacerloappendChild
condocument.createTextNode(text)
ydocument.createElement('br')
.document.createDocumentFragment
.Aquí hay una idea, ya que puede tener varias líneas nuevas en un cuadro de texto:
var text=document.getElementById('post-text').value.split('\n'); var html = text.join('<br />');
Este valor HTML conservará la nueva línea. Espero que esto ayude.
fuente
html
cadena resultante alguna vez se renderiza como HTML.&
o<
. Incluso si la seguridad no es una preocupación, sigue siendo un error.También podemos establecer
width
de div usando Javascript y añadirwhite-space:pre-wrap
ap tag
, esta ruptura de su contenido en el área de texto final de cada línea.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>
fuente
Supongo que no desea que el contenido de su área de texto se analice como HTML. En este caso, puede configurarlo como texto sin formato para que el navegador no lo trate como HTML y no elimine las líneas nuevas. No se requiere CSS ni preprocesamiento.
<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>
fuente
Preguntas similares están aquí
detectar saltos de línea en una entrada de área de texto
detectar salto de línea en el área de texto
Puedes probar esto:
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;
obtendrá el contenido de texto del área de texto ytextContent.replace(/\n/g, '<br/>')
encontrará todo el carácter de nueva línea en el código fuente/\n/g
en el contenido y lo reemplazará con el salto de línea html<br/>
.Otra opción es usar la
<pre>
etiqueta html . Vea la demostración a continuaciónvar 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>
fuente
textContent.replace()
a nada.) Su segundo ejemplo es vulnerable al mismo error de inyección de HTML que otras respuestas, porque está asignando una entrada de usuario sin escape ainnerHTML
(y su primer ejemplo sería igualmente vulnerable, si lo intentara para hacer algo útil con el resultado de lareplace()
llamada).