使用 jQuery 删除 HTML 元素之间的空格和换行符

IT技术 javascript jquery regex string replace
2021-02-03 01:16:09

使用 jQuery,我想删除 HTML 标签之间的空格和换行符。

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

应该:

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

我认为我需要的模式是:

>[\s]*<

这可以在不使用正则表达式的情况下完成吗?

6个回答

我尝试了 user76888 提出的技术,效果很好。为了方便,我把它打包成一个jQuery插件,并认为社区可能会喜欢它,所以在这里:

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

要使用它,只需将它包含在脚本标签中,然后选择一个标签以使用 jQuery 清理并调用函数,如下所示:

$('#widget').cleanWhitespace();
正是我需要在调整它们的边距之前删除 JSP 中按钮之间的空白。
2021-03-21 01:16:09
我应该怎么做才能只删除出现在第一个 nonEmpty 节点之前的那些空节点?中间的其他空节点应该保持原样。谢谢你的帮助...
2021-03-21 01:16:09
我可以建议return this;在清理后添加一个吗?这将允许用户链接您的功能。
2021-03-25 01:16:09
好主意!这就是所有其他 jQuery 函数所做的,我的函数也应该这样做。完毕。
2021-03-25 01:16:09
非常好!我会命名它removeWhitespace而不是cleanWhitespace
2021-03-31 01:16:09

递归版本:

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;
}
这将删除以下字符串中结束强标记之后的空格:“<strong>text</strong> more text”。
2021-03-15 01:16:09
这比@user76888 和@the-digital-gabeg 效果更好,我只是稍微修改了一下,return this;就像@the-digital-gabeg 修改了他的做法一样。这解决了我的表格中的空格问题,这是一个 IE9 错误。
2021-04-05 01:16:09

我认为这会做到...

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);
 }
}
这种方法很好,但它不适用于 IE(不是 9),因为它不考虑文本节点而只计算实际节点。所以你不能遍历它们并删除它们:(但我还没有找到更好的方法......
2021-04-01 01:16:09

将 HTML 设置为 DOM 节点后,您可能会做得更好。一旦浏览器解析了所有内容并从我们的标记中构建了一个 DOM 树,您就可以执行 DOM 遍历,并且对于您找到的每个文本节点,如果它没有非空白字符,则将其完全删除,或者从一开始就修剪空白并结束它,如果有的话。

+1。$('<div>').append(widgetHTML)是一个开始。从那里您可以在外部 div 内走子节点。在它调用结束时.html(),您将获得widgetHTML没有空的空白节点。
2021-03-14 01:16:09

这就是对我有用的方法和逐步发现:

输出来自 chrome 控制台

首先定位包含讨厌的空格的父节点

$('.controls label[class="radio"]').parent();

[<div class=​"controls">​
<label class=​"radio">​…​</label>​
" "
"    "
<label class=​"radio">​…​</label>​
" "
"    "
</div>​]

你可以看到它被包裹在一个来自 [] 括号的数组中,即使找到了单个项目,jQuery 也将始终返回一个类似结构的数组。

所以为了到达 HTMLElement 我们取数组中索引 0 处的第一项

$('.controls label[class="radio"]').parent()[0];

<div class=​"controls">​
<label class=​"radio">​…​</label>​
" "
"    "
<label class=​"radio">​…​</label>​
" "
"    "
</div>​

注意没有更多的 [] 括号。我们需要这样做的原因是因为 jQuery 会忽略 dom 中的空格而 HTMLElement 不会,看看当我们访问 childNodes 属性时会发生什么

$('.controls label[class="radio"]').parent()[0].childNodes;

[<label class=​"radio">​…​</label>​, 
" ", 
"    ", 
<label class=​"radio">​…​</label>​, 
" ", 
"    "]

我们又得到了一个数组,是的,你发现了 [] 括号,但你看到另一个不同之处了吗,看看所有的逗号,这是我们无法用 jQuery 得到的。谢谢 HTMLElement 但现在我们可以回到 jQuery 因为我想使用 each 而不是 for 循环,你同意我的观点吗?因此,让我们将数组包装在 jQuery 中,看看会发生什么:

$($('.controls label[class="radio"]').parent()[0].childNodes);

[<label class=​"radio">​…​</label>​, 
" ", 
"    ", 
<label class=​"radio">​…​</label>​, 
" ", 
"    "]

完美的!我们仍然有完全相同的结构,但现在在一个 jQuery 对象中,所以让我们调用每个并将“this”打印到控制台以查看我们有什么。

$($('.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|

所以我们使用 jQuery 来获取每个元素的 html,标准的东西 `$(this).html 并且因为我们看不到空格让我们用管道 | 填充它,好计划但是我们这里有什么?正如您所看到的,jQuery 无法将空格转换为 html,现在我们还没有定义。但这更好,因为一个空间可能是真实的 undefined 肯定是假的 =)

所以让我们摆脱 jQuery 的傻瓜。我们需要的只是$(this).html() || $(this).remove();我们看看:

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

[<label class=​"radio">​…​</label>​, 
" ", 
"    ", 
<label class=​"radio">​…​</label>​, 
" ", 
"    "]

哦,亲爱的……但不要害怕!每个仍然返回以前的结构而不是我们改变的结构,让我们看看我们的初始查询现在返回什么。

$('.controls label[class="radio"]').parent();

[<div class=​"controls">​
<label class=​"radio">​…​</label>​
<label class=​"radio">​…​</label>​
</div>​]

还有瓦拉!所有的性感和漂亮 =)

所以你有它,如何删除元素/标签 ala jQuery 样式之间的空白。

快乐!