Как использовать JavaScript для обнаружения
<br>
<br>
<br>
чтобы стать одним
<br>
?
Я пробовал:
jQuery('body').html().replace(/(\<br\>\r\n){3, }/g,"\n");
но это не работает для меня.
Как использовать JavaScript для обнаружения
<br>
<br>
<br>
чтобы стать одним
<br>
?
Я пробовал:
jQuery('body').html().replace(/(\<br\>\r\n){3, }/g,"\n");
но это не работает для меня.
Simpler:
var newText = oldText.replace(/(<br\s*\/?>){3,}/gi, '<br>');
Это позволит использовать дополнительный терминатор тегов (/" > ), а также пробелы до конца тега (например, <br />
или <br >
).
Если вы хотите отключить эффект нескольких <br>
на странице, вы можете сделать это с помощью CSS без использования JavaScript:
br + br { display: none; }
Однако этот метод идеален, когда вы работаете с тегами, примерно так:
<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />
В других случаях, например:
Hello World<br /> <br />
Hello World<br /> <br />
Hello World<br /> <br />
Он будет терпеть неудачу (поскольку CSS передает текстовые узлы). Вместо этого используйте JavaScript-решение.
// It better to wait for document ready instead of window.onload().
window.onload = function () {
// Get all `br` tags, defined needed variables
var br = document.getElementsByTagName('br'),
l = br.length,
i = 0,
nextelem, elemname, include;
// Loop through tags
for (i; i < l - 1; i++) {
// This flag indentify we should hide the next element or not
include = false;
// Getting next element
nextelem = br[i].nextSibling;
// Getting element name
elemname = nextelem.nodeName.toLowerCase();
// If element name is `br`, set the flag as true.
if (elemname == 'br') {
include = true;
}
// If element name is `#text`, we face text node
else if (elemname == '#text') {
// If text node is only white space, we must pass it.
// This is because of something like this: `<br /> <br />`
if (! nextelem.data.replace(/\s+/g, '').length) {
nextelem = br[i+1];
include = true;
}
}
// If the element is flagged as true, hide it
if (include) {
nextelem.style.display = 'none';
}
}
};
Какой смысл отправлять HTML-код, который не нужен, в клиентский браузер и запускать его JavaScript код для очистки? Это выглядит плохой дизайн.
Как насчет исправления всего вашего статического HTML и генерации HTML, чтобы эти лишние элементы <br>
не встречались в первую очередь?
Если вы используете JavaScript для изменения объекта документа, сделайте это для динамических эффектов, которые не могут быть достигнуты каким-либо другим способом.
Не было бы такого, чтобы это было правильным:
$("br~br").remove()
EDIT: Нет, это неправильно, потому что его определение "смежный" слишком слабое, как в BoltClock.
Попробуйте следующее:
jQuery('body').html(
jQuery('body').html().replace(/(?:<br>\s+){3,}/ig,"\n"));
);
DEMO: jsfiddle
Попробуйте это
$('body').html($('body').html().replace(/(<br>)+/g,"<br>"));
Он заменит n число <br>
на одно.
Я бы пошел с этим:
$('body').html($('body').html().replace(/<br\W?\\?>(\W?(<br\W?\\?>)+)+/g,"<br>"));
Однако после прочтения комментариев в другом сообщении здесь я считаю, что вы должны стараться избегать этого, если вы можете исправить его в конце.
Это решение только для jQuery + DOM, не управляет HTML как строка, работает с текстовыми узлами, игнорирует только текстовые узлы с пробелами:
$('br').each(function () {
const {nodeName} = this;
let node = this;
while (node = node.previousSibling) {
if (node.nodeType !== Node.TEXT_NODE || node.nodeValue.trim() !== '') {
break;
};
}
if (node && node !== this && node.nodeName === nodeName) {
$(node).remove();
}
});
Смотрите: https://jsfiddle.net/kov35jct/