Удалите последовательный <br> в div, заполненном пользователями CMS с помощью текстовых редакторов

0

У меня есть область div, которая заполняется пользователями CMS и отправляет данные через текстовый редактор. Как я могу удалить последовательные br- теги более двух в <div> с помощью jQuery?

Я попробовал 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.

  • 1
    и каков твой желаемый результат? удаление <br> когда есть больше чем 1 в каждом месте?
  • 0
    Какое отношение имеет parent или closest родственник к элементам родного брата? И где div вы упоминаете?
Показать ещё 8 комментариев
Теги:
removechild
rich-text-editor

3 ответа

1
Лучший ответ

Вот один из способов сделать это:

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

Это находит все элементы br внутри данного контейнера (в моем случае, элемент с id "starting-point"). Затем он проходит через них в порядке документа. Если у нас есть тот, у которого есть непосредственный предыдущий брат, элемент br, мы его удаляем. Мы оставляем его в покое, если вещь перед ним не является элементом br (например, текстовым узлом или элементом non- br). Обратите внимание, что это не считает <br> <br> быть два элемента последовательными, потому что пространство между ними.

Живой пример | Источник

  • 1
    Текст не учитывается: jsfiddle.net/rninty/8CH8T
  • 0
    @minitech: Ой, верно. Давайте посмотрим... :-)
Показать ещё 2 комментария
0

DOM!

Когда <br> встречается, он удаляется. Когда текст или элемент встречаются, следующий <br> не удаляется. Когда элемент встречается, на removeSequentialBR вызывается 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;
    }
}

Это демонстрация.

  • 0
    спасибо за решение
-1

Вы можете использовать просто регулярное выражение для анализа текста и замены всех вхождений, которые не подходят

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

1000 является магическим большим числом, которое должно включать в себя все <br> с; при необходимости увеличьте это значение. Может быть, существует неограниченная ценность? 0 может быть?

EDIT: Извините за плохой ответ. Я исправил это выражение. Теперь он работает правильно и находит все возможные варианты.

  • 0
    Вы должны проверить это. Так как он не выполняет замену регулярного выражения, конец вашего выражения экранирован неправильно, [[<br>] не имеет смысла, \[<br>\s] не имеет смысла, и почему это {12,1000} 1000 волшебно, конечно, но как насчет 12? В любом случае, вы можете отменить его с помощью \s{12,}
  • 0
    Спасибо за неограниченный намек. Я исправил это. Я определенно выстрелил слишком быстро, извините за это.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню