0

CMS ユーザーが入力し、リッチ テキスト エディターを介してデータを送信する div エリアがあります。jQueryを使用して2つ以上の連続したbrタグを削除するにはどうすればよいですか?<div>

試してみましたがparent()closest()うまくいきませんでした。

たとえば、CMS ユーザーがリッチ テキスト エディターを使用してこの HTML コードを追加したとします。

<div class="cms-data">
<br>
<span>
<br><br><br><br><br><br>
<a href="/uploads/755/a1.xls" target="_blank">xls</span></a>
<br><br><br>
</span>
<br><br>
</div>

編集:<div> cms-data にクラス名を追加しました。

4

3 に答える 3

1

これを行う1つの方法は次のとおりです。

$("#starting-point").find("br").each(function() {
    if (this.previousSibling && this.previousSibling.nodeName.toUpperCase() == 'BR') {
        $(this).remove();
    }
});

brこれにより、指定されたコンテナー内のすべての要素が検索されます (私の場合は、 を持つ要素id "starting-point")。次に、それらをドキュメント順にループします。要素である直前の兄弟を持つものがある場合はbr、それを削除します。brそのすぐ前にあるものが要素でない場合 (テキスト ノードや非要素など) 、そのままにしておきますbr<br> <br>これらの間にスペースがあるため、これは 2 つの連続する要素とは見なされないことに注意してください。

実例| ソース

于 2013-11-08T14:26:31.213 に答える
0

ドム!

が検出される<br>と、それは削除されます。テキストまたは要素が検出された場合、次<br>は削除されません。要素が検出removeSequentialBRされると、それに対しても呼び出されます。

function removeSequentialBR(node) {
    var child = node.firstChild;
    var remove = true;

    while (child) {
        if (child.nodeType === 1) {
            if (child.nodeName === "BR") {
                if (remove) {
                    var newChild = child.nextSibling;
                    child.parentNode.removeChild(child);
                    child = newChild;
                    continue;
                }

                remove = true;
            } else {
                remove = false;
                removeSequentialBR(child);
            }
        } else if (child.nodeType === 3 && /\S/.test(child.nodeValue)) {
            remove = false;
        }

        child = child.nextSibling;
    }
}

これがデモです。

于 2013-11-08T14:26:26.460 に答える
-2

正規表現のみを使用してテキストを解析し、適合しないすべての出現箇所を置き換えることができます

value = value.replace("/(<br>(\s)*){2,}/","<br><br>");

1000 は魔法のような大きな数字で、すべての<br>s を含む必要があります。必要に応じて、この値を増やしてください。たぶん、無制限の値がありますか?0かも?

編集:悪い答えで申し訳ありません。表現を直しました。現在は適切に機能し、発生する可能性のあるすべてのセットを検出しています。

于 2013-11-08T14:36:21.557 に答える