0

如何<p>从 div 的 html 中删除非文本节点(BR,空标签,nbsp),但仅删除在第一个文本节点出现之前出现的节点。就像从普通字符串中去除前导空格一样,但这里是从 HTML 字符串中删除前导空格。

我尝试过使用正则表达式,但这种方法经常会出现问题。我想用NodeTypeJQuery 来做。如果有人有任何例子,请分享。

谢谢!

UPDATE:

采取以下DIV: -

<div id="foo">
        <div>
            <div>
                <p>
                </p>
                <p>
                    &nbsp;
                </p>
                <br/>
                <p>
                    this is a test</p>
                <p>
                    &nbsp;
                </p>
                <br />
                <br>
                <p>
                    this is a fast test
                </p>
            </div>
        </div>
    </div>

将“foo”传递给空格删除函数时,它应该如下所示:-

<div id="foo">
        <div>
            <div>
                <p>
                    this is a test</p>
                <p>
                    &nbsp;
                </p>
                <br />
                <br>
                <p>
                    this is a fast test
                </p>
            </div>
        </div>
    </div>
4

1 回答 1

2

这样的事情应该这样做:

var $contents = $('#foo').contents();
var stopFiltering = false;

$contents.filter(function() {
    var isEmpty = $.trim($(this).text()) == '' ||
                  this.tagName == "BR";
    var shouldFilter = !stopFiltering && isEmpty;
    stopFiltering = stopFiltering || !isEmpty;
    return shouldFilter;
}).remove();

这是对filter功能的改编。每个元素(包括文本节点)都经过“空性”测试(isEmpty)。After the first non-empty node is seenshouldFiltering设置为 false,这样过滤条件就表达了您的要求:在第一个非空节点之前选择空节点和元素。

看到它在行动

更新: 递归解决方案在这里。它只是将上述内容打包成一个函数TrimElements,并在处理目标元素本身之前递归到目标元素的所有子元素中。

于 2011-09-22T06:50:56.853 回答