Comment puis-je utiliser JavaScript pour détecter
<br>
<br>
<br>
pour devenir un
<br>
?
J'ai essayé avec :
jQuery('body').html().replace(/(\<br\>\r\n){3, }/g,"\n");
mais cela ne fonctionne pas pour moi.
Comment puis-je utiliser JavaScript pour détecter
<br>
<br>
<br>
pour devenir un
<br>
?
J'ai essayé avec :
jQuery('body').html().replace(/(\<br\>\r\n){3, }/g,"\n");
mais cela ne fonctionne pas pour moi.
Si vous voulez désactiver l'effet de multiples <br>
sur la page, vous pouvez le faire par CSS sans utiliser JavaScript :
br + br { display: none; }
Cependant, cette méthode est idéale lorsque vous travaillez avec des balises, comme ceci :
<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />
<div>Text</div><br /><br /><br />
Dans d'autres cas, comme celui-ci :
Hello World<br /> <br />
Hello World<br /> <br />
Hello World<br /> <br />
Il échouera (comme CSS passe les nœuds de texte). Utilisez plutôt une solution JavaScript.
// It's 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';
}
}
};
Quel est l'intérêt d'envoyer du HTML, qui est dans une forme que vous ne voulez pas, au navigateur du client et de lui faire exécuter JavaScript code pour le nettoyer ? Cela ressemble à une mauvaise conception.
Et si vous répariez votre HTML statique et votre génération de HTML de façon à ce que ces éléments superflus <br>
les éléments ne se produisent pas en premier lieu ?
Si vous utilisez JavaScript pour modifier l'objet document, faites-le pour obtenir des effets dynamiques qui ne peuvent être obtenus d'aucune autre manière.
@w4rumu Ou peut-être que le HTML vient d'un autre site. Javascript n'est pas toujours associé à un site Web particulier. Il peut y avoir du Javascript qui s'exécute dans le navigateur en tant qu'extension du navigateur, modifiant le HTML pour l'utilisateur.
Si, en général, vos conseils sont bons (donc +1), ils ne répondent pas directement à la question. Parfois, vous devez faire face à des html pour lesquels vous n'avez absolument aucun contrôle sur la personne qui les a générés ou sur la raison pour laquelle ils ont été générés de cette façon - dans ce cas, les solutions directes à des questions comme celle-ci deviennent bénéfiques et les choses comme "réparer pour commencer" deviennent impossibles. (D'un autre côté, ces types de transformations du html sur lesquelles vous n'avez pas de contrôle se produisent de toute façon du côté du serveur, auquel cas elles peuvent être corrigées de ce côté -- javascript est probablement le mauvais endroit pour faire cela de toute façon).
Mais comment m'assurer qu'il ne fonctionne que lorsqu'il a trouvé plus de 3 <br > pour faire le travail ?
Mais en changeant le quantificateur +
a {3,}
comme dans les autres exemples, cela fonctionnera de cette façon. Réponse mise à jour...
Cette solution est uniquement jQuery + DOM, ne manipule pas le HTML en tant que chaîne, fonctionne avec des nœuds de texte, ignore les espaces blancs uniquement pour les nœuds de texte :
$('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();
}
});
Pour préciser, il s'agit du sélecteur jQuery "next siblings" : api.jquery.com/next-siblings-selector
Cela tue le deuxième <br>
en <br><hr><br><hr>
malgré les <br>
les éléments n'étant pas contigus. Selon le cas d'utilisation, cela peut ne pas être souhaitable.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
2 votes
Je suis surpris que personne n'ait suggéré d'utiliser une regex :(
6 votes
@LescaiIonel Vraiment ? Lisez les réponses. Mais de toute façon nous avons le DOM alors pourquoi s'embêter avec les regex ? (Certains jours nous verrons Tony le poney .) En outre, le remplacement du HTML obligera le navigateur à reparser le HTML, ce qui n'est pas efficace.
5 votes
Si vous ne voulez pas avoir plusieurs
<br>
pourquoi sont-ils là en premier lieu ?0 votes
@AlvinWong ouais, je connais le post ;). Est-ce que ces fonctions de remplacement jquery sont des regex ?
1 votes
J'ai voulu lire cette question juste pour la destruction des regex :)
2 votes
Comment cette question et cette réponse ont-elles obtenu autant de vues et de votes en si peu de temps ?
0 votes
@RobW - c'est dans la liste des "questions chaudes".
3 votes
@mskfisher : Ce qui est plus curieux, c'est comment cette question est arrivée sur Hot Questions en premier lieu.
0 votes
@Macke Venez pour le regex, restez pour le meta-regex.