139 votes

jQuery text() et les nouvelles lignes

Je veux pouvoir dire

$(someElem).text('this\n has\n newlines);

et il est rendu avec des nouvelles lignes dans le navigateur. La seule solution que j'ai trouvée est de définir la propriété css 'white-space' à 'pre' sur someElem. Cela fonctionne presque, mais j'ai alors un large padding entre le texte et le haut de someElem, même lorsque je règle le padding sur 0. Y a-t-il un moyen de s'en débarrasser ?

3 votes

En l'enveloppant avec <pre> (et l'utilisation de .html() au lieu de .text()) est, à mon avis, la solution la plus simple et la meilleure pour maintenir les sauts de ligne à partir d'un fichier texte ou d'un texte brut (ceci est suggéré par la réponse de Karim ci-dessous). CEPENDANT : L'alternative plus récente à cela est d'utiliser white-space: pre-wrap; comme suggéré dans la réponse de Cleong

2 votes

Pourquoi ne pas utiliser append() au lieu de test() y <br/> au lieu de \n ? comme ça - $(someElem).append("this <br/> has <br/> newlines");

72voto

Si vous stockez l'objet jQuery dans une variable, vous pouvez le faire :

var obj = $(someElem).text('this\n has\n newlines');
obj.html(obj.html().replace(/\n/g,'<br/>'));

Si vous préférez, vous pouvez également créer une fonction pour faire cela avec un simple appel, tout comme le fait jQuery.text() :

$.fn.multiline = function(text){
    this.text(text);
    this.html(this.html().replace(/\n/g,'<br/>'));
    return this;
}

Maintenant, vous pouvez le faire :

$(someElem).multiline('this\n has\n newlines');

0 votes

Il manque une parenthèse fermante dans la deuxième ligne du premier extrait de code.

1 votes

Cela répond en fait à la question de l'OP

0 votes

Le meilleur, il a fonctionné comme un charme et a résolu le problème.

37voto

Peter V. Mørch Points 1589

Voici ce que j'utilise :

function htmlForTextWithEmbeddedNewlines(text) {
    var htmls = [];
    var lines = text.split(/\n/);
    // The temporary <div/> is to perform HTML entity encoding reliably.
    //
    // document.createElement() is *much* faster than jQuery('<div></div>')
    // http://stackoverflow.com/questions/268490/
    //
    // You don't need jQuery but then you need to struggle with browser
    // differences in innerText/textContent yourself
    var tmpDiv = jQuery(document.createElement('div'));
    for (var i = 0 ; i < lines.length ; i++) {
        htmls.push(tmpDiv.text(lines[i]).html());
    }
    return htmls.join("<br>");
}
jQuery('#div').html(htmlForTextWithEmbeddedNewlines("hello\nworld"));

1 votes

En fait, elle est supérieure à la suggestion de Mark parce qu'elle ne risque pas de subir une attaque XSS.

0 votes

Je pense que vous pourriez créer le div (c'est-à-dire : document.createElement('div')) à partir de la fonction et l'utiliser pour tous les appels, n'est-ce pas ?

0 votes

@FabioZadrozny : Oui, vous avez raison ! J'ai modifié la réponse (presque) en conséquence. La div est créée à l'intérieur de la fonction mais en dehors de la boucle maintenant. Il pourrait être en dehors de la fonction entièrement, mais alors il devient encombrant à utiliser.

22voto

karim79 Points 178055

Vous pouvez également essayer d'utiliser .html et ensuite envelopper avec <pre> tags :

$(someElem).html('this\n has\n newlines').wrap('<pre />');

0 votes

C'est ce que j'ai fait, j'ai utilisé le format .text au lieu du format .html.

15voto

Mark Byers Points 318575

Vous pouvez utiliser html au lieu de text et remplacer chaque occurrence de \n avec <br> . Vous devrez cependant échapper correctement votre texte.

x = x.replace(/&/g, '&amp;')
     .replace(/>/g, '&gt;')
     .replace(/</g, '&lt;')
     .replace(/\n/g, '<br>');

0 votes

@Matthew Flaschen : Merci, c'est réparé.

7 votes

Certaines personnes lisant cette réponse ne savent probablement pas à quel point cela est dangereux. N'utilisez jamais cette solution avec du texte fourni par l'utilisateur. La solution de Peter Mørch est préférable.

1 votes

@kulebyashik Utilisation de la solution de Peter text alors que cette réponse utilise html directement.

1voto

JochenJung Points 4864

Je vous suggère de travailler avec le someElem directement, en remplacement de l'élément .html() remplacerait également les autres balises HTML de la chaîne.

Voici ma fonction :

function nl2br(el) {
  var lines = $(el).text().split(/\n/);
  $(el).empty();
  for (var i = 0 ; i < lines.length ; i++) {
    if (i > 0) $(el).append('<br>');
    $(el).append(document.createTextNode(lines[i]));
  }
  return el;
}

Appelez-le par :

someElem = nl2br(someElem);

1 votes

NOTE AU LECTEUR : Cette réponse est particulièrement utile si vous prévoyez de développer un add-on pour Firefox. innerHTML ou (.html() si vous utilisez jQuery) est mal vu par le W3C et Mozilla, et le code ci-dessus est très utile pour passer le processus de révision. Pour plus d'informations, voir Considérations de sécurité @ developer.mozilla.org/fr/US/docs/Web/API/Element.innerHTML

Prograide.com

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.

Powered by:

X