usando salto linea evitar espacio content blanco javascript jquery regex string replace

javascript - linea - Elimine el espacio en blanco y los saltos de línea entre elementos HTML usando jQuery



salto de linea usando css (8)

Usando jQuery, me gustaría eliminar el espacio en blanco y los saltos de línea entre etiquetas HTML.

var widgetHTML = '' <div id="widget"> <h2>Widget</h2><p>Hi.</p> </div>'';

Debiera ser:

alert(widgetHTML); // <div id="widget"><h2>Widget</h2><p>Hi.</p></div>

Creo que el patrón que necesitaré es:

>[/s]*<

¿Se puede lograr esto sin usar expresiones regulares?


Creo que esto lo hará ...

cleanWhitespace: function(element) { element = $(element); for (var i = 0; i < element.childNodes.length; i++) { var node = element.childNodes[i]; if (node.nodeType == 3 && !//S/.test(node.nodeValue)) Element.remove(node); } }


Esto es lo que funcionó para mí y el descubrimiento paso a paso:

La salida es desde la consola de Chrome

Primero locato al nodo padre que contiene el desagradable espacio en blanco

$(''.controls label[class="radio"]'').parent(); [<div class=​"controls">​ <label class=​"radio">​…​</label>​ " " " " <label class=​"radio">​…​</label>​ " " " " </div>​]

Puede ver que está envuelto en una matriz de los corchetes [] jQuery siempre devolverá una estructura similar a una matriz, incluso cuando se haya encontrado un solo elemento.

Entonces, para llegar al HTMLElement, tomamos el primer elemento en el conjunto en el índice 0

$(''.controls label[class="radio"]'').parent()[0]; <div class=​"controls">​ <label class=​"radio">​…​</label>​ " " " " <label class=​"radio">​…​</label>​ " " " " </div>​

Tenga en cuenta que no hay más [] corchetes. La razón por la que necesitamos hacer esto es porque jQuery ignorará el espacio en blanco en el dom pero HTMLElement no lo hará, mira lo que sucede cuando accedemos a la propiedad childNodes

$(''.controls label[class="radio"]'').parent()[0].childNodes; [<label class=​"radio">​…​</label>​, " ", " ", <label class=​"radio">​…​</label>​, " ", " "]

Tenemos una matriz de nuevo, sí se detectan los corchetes [], pero ¿ves otra diferencia ?, mira todas las comas que no pudimos obtener con jQuery. Gracias HTMLElement pero ahora podemos volver a jQuery porque quiero usar cada uno en lugar de un ciclo for, ¿estás de acuerdo conmigo? Así que vamos a envolver la matriz en jQuery y ver qué sucede:

$($(''.controls label[class="radio"]'').parent()[0].childNodes); [<label class=​"radio">​…​</label>​, " ", " ", <label class=​"radio">​…​</label>​, " ", " "]

¡Perfecto! tenemos exactamente la misma estructura pero ahora dentro de un objeto jQuery, así que llamemos a cada uno e imprimamos "esto" a la consola para ver lo que tenemos.

$($(''.controls label[class="radio"]'').parent()[0].childNodes).each(function () { console.log(''|''+$(this).html()+''|''); }); |<input id="gender_f" name="gender" type="radio" value="f">Female| |undefined| |undefined| |<input id="gender_m" name="gender" type="radio" value="m" checked="">Male| |undefined| |undefined|

Así que usamos jQuery para obtener el html de cada elemento, el material estándar `$ (this) .html y porque no podemos ver el espacio en blanco, lo abrimos con un pipe |, buen plan, pero ¿qué tenemos aquí? Como puede ver, jQuery no puede convertir el espacio en blanco en html y ahora no tenemos definido. Pero esto es aún mejor porque cuando un espacio puede ser verdad indefinido definitivamente es falso =)

Así que vamos a deshacernos de los retoños con jQuery. Todo lo que necesitamos es $(this).html() || $(this).remove(); $(this).html() || $(this).remove(); veamos:

$($(''.controls label[class="radio"]'').parent()[0].childNodes).each(function () { $(this).html() || $(this).remove(); }); [<label class=​"radio">​…​</label>​, " ", " ", <label class=​"radio">​…​</label>​, " ", " "]

Oh querido ... ¡pero no temas! Cada uno devuelve la estructura anterior, no la que hemos cambiado, veamos qué devuelve nuestra consulta inicial ahora.

$(''.controls label[class="radio"]'').parent(); [<div class=​"controls">​ <label class=​"radio">​…​</label>​ <label class=​"radio">​…​</label>​ </div>​]

¡Y Wallah! Todo sexy y bonito =)

Así que ahí lo tienes, cómo eliminar espacios en blanco entre elementos / etiquetas estilo jQuery ala.

nJoy!


Podrías $.trim(widgetHTML); para leer sobre el espacio en blanco circundante.


Probé la técnica que el usuario76888 presentó y funcionó bien. Lo empaqué en un plugin jQuery por conveniencia, y pensé que la comunidad podría disfrutarlo, así que aquí:

jQuery.fn.cleanWhitespace = function() { this.contents().filter( function() { return (this.nodeType == 3 && !//S/.test(this.nodeValue)); }) .remove(); return this; }

Para usar esto, simplemente inclúyalo en una etiqueta de script, luego seleccione una etiqueta para limpiar con jQuery y llame a la función de la siguiente manera:

$(''#widget'').cleanWhitespace();


Probablemente puedas hacer esto mejor después de configurar HTML en un nodo DOM. Una vez que el navegador haya analizado todo y construido un árbol DOM fuera de nuestro marcado, puede hacer una caminata DOM y para cada nodo de texto que encuentre, elimínelo por completo si no tiene caracteres que no sean de espacio en blanco, o recorte el espacio en blanco del inicio y al final si es así.


Tuve que modificar un poco la respuesta aceptada porque, por algún motivo, Chrome no quería eliminar a Child () en los nodos de espacio en blanco. Si esto sucede, podría reemplazar el nodo con un nodo de texto vacío como en este ejemplo de función auxiliar:

var removeWhiteSpaceNodes = function ( parent ) { var nodes = parent.childNodes; for( var i =0, l = nodes.length; i < l; i++ ){ if( nodes[i] && nodes[i].nodeType == 3 && !//S/.test( nodes[i].nodeValue ) ){ parent.replaceChild( document.createTextNode(''''), nodes[i] ); }else if( nodes[i] ){ removeWhiteSpaceNodes( nodes[i] ); } } }

Toma un nodo del que desea eliminar espacios en blanco y reemplaza recursivamente todos los espacios en blanco con un texto realmente vacío.


Una versión recursiva:

jQuery.fn.htmlClean = function() { this.contents().filter(function() { if (this.nodeType != 3) { $(this).htmlClean(); return false; } else { this.textContent = $.trim(this.textContent); return !//S/.test(this.nodeValue); } }).remove(); return this; }


Utilizar

$($.parseHTML(widgetHTML, document, true)).filter("*"),