如何从div的内容的开头删除所有非文本节点?

时间:2011-09-22 06:30:39

标签: jquery html removing-whitespace

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

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

谢谢!

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>

1 个答案:

答案 0 :(得分: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)。在看到第一个非空节点后,shouldFiltering被设置为false,这样过滤条件就表达了您的要求:在第一个非空节点之前选择空节点和元素。

<强> See it in action

更新: Recursive solution is here。它只是将上面的内容打包成函数TrimElements,然后在处理目标元素本身之前将其递归到目标元素的所有子元素中。