two respect prevent dont don breaks javascript jquery html replace line-breaks

javascript - respect - Reemplaza mĂșltiples<br> con solo una<br><br>



javascript text br (8)

Solución CSS

Si desea deshabilitar el efecto de múltiples <br> en la página, puede hacerlo mediante CSS sin usar JavaScript:

br + br { display: none; }

Sin embargo, este método es ideal cuando trabajas con etiquetas, algo como esto:

<div>Text</div><br /><br /><br /> <div>Text</div><br /><br /><br /> <div>Text</div><br /><br /><br />

En otros casos, así:

Hello World<br /> <br /> Hello World<br /> <br /> Hello World<br /> <br />

Fallará (a medida que CSS pasa los nodos de texto). En cambio, usa una solución de JavaScript.

Solución de JavaScript

// It''s better to wait for document ready instead of window.onload(). window.onload = function () { // Get all `br` tags, defined needed variables var br = document.getElementsByTagName(''br''), l = br.length, i = 0, nextelem, elemname, include; // Loop through tags for (i; i < l - 1; i++) { // This flag indentify we should hide the next element or not include = false; // Getting next element nextelem = br[i].nextSibling; // Getting element name elemname = nextelem.nodeName.toLowerCase(); // If element name is `br`, set the flag as true. if (elemname == ''br'') { include = true; } // If element name is `#text`, we face text node else if (elemname == ''#text'') { // If text node is only white space, we must pass it. // This is because of something like this: `<br /> <br />` if (! nextelem.data.replace(//s+/g, '''').length) { nextelem = br[i+1]; include = true; } } // If the element is flagged as true, hide it if (include) { nextelem.style.display = ''none''; } } };

¿Cómo uso JavaScript para detectar

<br> <br> <br>

convertirse en uno

<br>

?

Intenté con:

jQuery(''body'').html().replace(/(/<br/>/r/n){3, }/g,"/n");

pero esto no está funcionando para mí.


¿De qué sirve enviar el código HTML, que está en un formato que no desea, al navegador del cliente y hacer que ejecute el código JavaScript para limpiarlo? Esto parece un mal diseño.

¿Qué hay de arreglar todo su HTML estático, y la generación de HTML, para que estos elementos innecesarios <br> no se produzcan en primer lugar?

Si usa JavaScript para modificar el objeto del documento, hágalo para los efectos dinámicos que no se pueden lograr de ninguna otra manera.


¿No sería algo así como el enfoque correcto?

$("br~br").remove()

EDITAR: No, está mal, porque su definición de "contiguo" es demasiado suelta, como en BoltClock.


Esta solución es jQuery + DOM solamente, no manipula HTML como cadena, funciona con nodos de texto, ignora los espacios en blanco solo los nodos de texto:

$(''br'').each(function () { const {nodeName} = this; let node = this; while (node = node.previousSibling) { if (node.nodeType !== Node.TEXT_NODE || node.nodeValue.trim() !== '''') { break; }; } if (node && node !== this && node.nodeName === nodeName) { $(node).remove(); } });

Ver: https://jsfiddle.net/kov35jct/


Me gustaría ir con esto:

$(''body'').html($(''body'').html().replace(/<br/W?//?>(/W?(<br/W?//?>)+)+/g,"<br>"));

Sin embargo, después de leer los comentarios en otra publicación aquí, considero que debes tratar de evitar hacer esto en caso de que puedas corregirlo en la parte de atrás.


Prueba esto

$(''body'').html($(''body'').html().replace(/(<br>)+/g,"<br>"));

Reemplazará n cantidad de <br> en uno.

Demo


Prueba esto:

jQuery(''body'').html( jQuery(''body'').html().replace(/(?:<br>/s+){3,}/ig,"/n")); );

DEMO: jsfiddle


Simpler:

var newText = oldText.replace(/(<br/s*//?>){3,}/gi, ''<br>'');

Esto permitirá el finalizador de etiqueta opcional (/>) y también espacios antes del final de la etiqueta (por ejemplo, <br /> o <br>).