178 votes

Peut-on avoir un texte de remplacement HTML5 multiligne dans un <textarea> ?

J'ai des textes fantômes dans des champs de texte qui disparaissent lorsque vous vous concentrez dessus en utilisant l'attribut placeholder de HTML5 :

<input type="text" name="email" placeholder="Enter email"/>

Je veux utiliser ce même mécanisme pour avoir un texte de remplacement multiligne dans une zone de texte, peut-être quelque chose comme ceci :

<textarea name="story" placeholder="Enter story\n next line\n more"></textarea>

Mais ces \n s apparaissent dans le texte et ne provoquent pas de saut de ligne... Existe-t-il un moyen d'avoir un espace réservé multiligne ?

UPDATE : La seule façon dont j'ai réussi à faire fonctionner ce système était d'utiliser la fonction plugin jQuery Watermark qui accepte le HTML dans le texte de remplacement :

$('.textarea_class').watermark('Enter story<br/> * newline', {fallback: false});

0 votes

IE semble le gérer correctement. Firefox, quant à lui, ignore les nouvelles lignes.

1 votes

stackoverflow.com/questions/7312623/ est une question très similaire avec de bonnes réponses également.

0 votes

Si vous rencontrez ce problème et que vous utilisez des js pour définir la valeur, vérifiez le css. white-space pour s'assurer qu'il est réglé correctement, par exemple, le pré-enroulement.

88voto

Ionuț G. Stan Points 62482

Pour <textarea> s la spécification souligne spécifiquement que les retours de chariot + les sauts de ligne dans l'attribut placeholder DOIVENT être rendus comme des sauts de ligne par le navigateur.

Les agents utilisateurs doivent présenter cette indication à l'utilisateur lorsque la valeur de l'élément est une chaîne vide et que le contrôle n'est pas focalisé (par exemple, en l'affichant à l'intérieur d'un contrôle vide non focalisé). Toutes les paires de caractères U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) dans l'indication, ainsi que tous les autres caractères U+000D CARRIAGE RETURN (CR) et U+000A LINE FEED (LF) dans l'indication, doivent être traités comme des sauts de ligne lors du rendu de l'indication.

Également repris sur MDN : https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea#attr-placeholder

Pour information, lorsque j'essaie sur Chrome 63.0.3239.132, cela fonctionne effectivement comme prévu.

38 votes

Sauf que l'attribut title ne se comporte pas de la même manière, c'est-à-dire qu'il ne montre pas de contenu fantôme. en fait, il serait parfaitement approprié que les placeholders supportent plusieurs lignes pour les zones de texte puisque les zones de texte sont des créatures à plusieurs lignes. dommage que la spécification ne le permette pas. Je suppose que les bidouillages devront faire l'affaire. soupir

78voto

cyrbil Points 159

Sur le plus (voir détails ci-dessous), l'édition de l'espace réservé en javascript permet un espace réservé multiligne. Comme il a été dit, ce n'est pas conforme à la norme spécification et vous ne devriez pas vous attendre à ce qu'il fonctionne dans le futur (edit : il fonctionne).

Cet exemple remplace tous l'espace réservé de la zone de texte multiligne.

var textAreas = document.getElementsByTagName('textarea');

Array.prototype.forEach.call(textAreas, function(elem) {
    elem.placeholder = elem.placeholder.replace(/\\n/g, '\n');
});

<textarea class="textAreaMultiline" 
          placeholder="Hello, \nThis is multiline example \n\nHave Fun"
          rows="5" cols="35"></textarea>

<a href="https://jsfiddle.net/qfvkLp6m/" rel="nofollow noreferrer">JsFiddle </a>extrait.

Résultat attendu

Expected result


D'après les commentaires, il semble que certains navigateurs acceptent ce hack et d'autres non.
Voici les résultats des tests que j'ai effectués (avec fureteurs et pile de navigation )

  • Chrome : >= 35.0.1916.69
  • Firefox : >= 35.0 (les résultats varient selon la plateforme)
  • IE : >= 10
  • Navigateurs basés sur KHTML : 4.8
  • Safari : Non (testé = Safari 8.0.6 Mac OS X 10.8)
  • Opera : Non (testé <= 15.0.1147.72)

Fusionné avec des thèses statistiques ce qui signifie qu'il fonctionne sur environ 88.7% d'actuellement (octobre 2015) les navigateurs utilisés.

Mise à jour : Aujourd'hui, il fonctionne sur au moins 94.4% d'actuellement (juillet 2018) les navigateurs utilisés.

1 votes

Cet exemple de jsfiddle ne fonctionne pas du tout... C'est seulement multi-linéaire à cause de la taille de la zone de texte.

3 votes

Il y a une faute de frappe, mais je ne peux pas l'éditer car StackOverflow me donne cette erreur "Edits must be at least 6 characters". Votre classe devrait être multiline pas multiligne

0 votes

@sebnukem : Cela fonctionne sur la plupart des navigateurs que j'ai testés. Et ce n'est pas une question de taille de textarea. Pouvez-vous fournir plus d'informations sur le problème que vous avez rencontré ?

62voto

Thomas Hunter II Points 1925

Je trouve que si vous utilisez beaucoup d'espaces, le navigateur l'enveloppera correctement. Ne vous souciez pas d'utiliser un nombre exact d'espaces, mettez-en beaucoup, et le navigateur devrait se positionner correctement sur le premier caractère sans espace de la ligne suivante.

<textarea name="address" placeholder="1313 Mockingbird Ln         Saginaw, MI 45100"></textarea>

2 votes

Oui, les caractères de remplacement multilignes ne sont pas pris en charge par les différents navigateurs. J'ai constaté que la dernière version de Safari les prend en charge, mais ils ne le sont absolument pas sous IOS5.

8 votes

Cela ne fonctionne pas pour moi, ni dans IE ni dans Firefox Windows. Il insère juste les espaces que je lui ai demandés.

0 votes

Chrome 37 affiche du texte de remplacement dans une zone de texte sans supprimer les sauts de ligne. Quelqu'un sait-il comment s'appelle cette "fonctionnalité" afin que je puisse a) la rechercher et b) la tester ?

23voto

Gottox Points 387

Il existe actuellement un piratage qui permet d'ajouter des espaces réservés multilignes dans les navigateurs Webkit. Chrome fonctionnait auparavant, mais les versions plus récentes l'ont supprimé :


Ajoutez d'abord la première ligne de votre placeholder au html5 comme d'habitude

<textarea id="text1" placeholder="Line 1" rows="10"></textarea>

puis ajoutez le reste de la ligne par css :

#text1::-webkit-input-placeholder::after {
    display:block;
    content:"Line 2\A Line 3";
}

Si vous voulez garder vos lignes au même endroit, vous pouvez essayer ce qui suit. L'inconvénient de cette méthode est que les navigateurs autres que chrome, safari, webkit-etc. n'affichent même pas la première ligne :

<textarea id="text2" placeholder="." rows="10"></textarea>

puis ajoutez le reste de la ligne par css :

#text2::-webkit-input-placeholder{
    color:transparent;
}

#text2::-webkit-input-placeholder::before {
    color:#666;
    content:"Line 1\A Line 2\A Line 3\A";
}

Fiddle Demo

Ce serait vraiment génial si s.o. pouvait faire fonctionner une démo similaire sur Firefox.

0 votes

Merci d'avoir fourni le lien du fiddle. il permet de vérifier facilement le comportement dans différents navigateurs. sur IE 10 les deux versions échouent, ainsi que sur FF 12 (Windows). dommage. Safari 6.1 fonctionne :(

2 votes

Ne fonctionne plus dans Chrome - depuis longtemps, je suppose.

3voto

Silent Penguin Points 166

Le site Spécifications html5 rejette expressément les nouvelles lignes dans le champ du titulaire. Versions de Webkit /volonté/ insère de nouvelles lignes lorsqu'il y a des retours à la ligne dans l'espace réservé, mais ce comportement est incorrect et il ne faut pas s'y fier.

Je suppose que les paragraphes ne sont pas assez brefs pour w3 ;)

1 votes

Le comportement de Webkit n'est pas incorrect puisque la spécification ne dit pas ce qui doit se passer si les CR/LF existent.

1 votes

@Christian C'est le cas maintenant, il est dit "Les agents utilisateurs doivent présenter cet indice à l'utilisateur, après avoir supprimé les sauts de ligne...". Il est dit ceci à propos de la suppression des sauts de ligne : "Lorsqu'un agent utilisateur doit supprimer les sauts de ligne d'une chaîne, il doit supprimer tous les caractères "LF" (U+000A) et "CR" (U+000D) de cette chaîne".

0 votes

Cette réponse n'est plus vraie. Le site spec exige désormais expressément que les sauts de ligne dans l'espace réservé soient rendus comme des sauts de ligne.

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