Insérer un saut de ligne à l'intérieur de l'attribut d'espace réservé d'une zone de texte?

179

J'ai essayé quelques approches mais aucune n'a fonctionné. Est-ce que quelqu'un connaît une astuce astucieuse pour contourner cela?

<textarea placeholder='This is a line \n this should be a new line'></textarea>

<textarea placeholder='This is a line     
should this be a new line?'></textarea> <!-- this works in chrome apparently -->

MISE À JOUR: cela ne fonctionne pas dans Chrome. C'était juste la largeur de la zone de texte.

Voir: http://jsfiddle.net/pdXRx/

amosrivera
la source
2
Si vous utilisez PHP, vous pouvez mettre <?="\n"?>une nouvelle ligne
rybo111
39
Ajoutez simplement &#10;l'attribut d'espace réservé, comme <textarea placeholder="This is a line&#10;This is another one"></textarea>. La réponse est ci-dessous.
lu1s
4
@ lu1s cela fonctionne dans Chrome, IE mais pas dans Firefox et Safari.
mb21
1
@ mb21 Je l'ai testé il y a une minute dans Firefox 60.0.2 et maintenant cela fonctionne. Peut-être que cela fonctionnerait dans la plupart des navigateurs maintenant.
tsuma534
3
C'est 2020 et toujours pas de solution pour Safari?
Ömer An

Réponses:

61

Ce que vous pouvez faire est d'ajouter le texte en tant que value, ce qui respecte le saut de ligne \n.

$('textarea').attr('value', 'This is a line \nthis should be a new line');

Ensuite, vous pouvez le retirer focuset le réappliquer (s'il est vide) blur. Quelque chose comme ça

var placeholder = 'This is a line \nthis should be a new line';
$('textarea').attr('value', placeholder);

$('textarea').focus(function(){
    if($(this).val() === placeholder){
        $(this).attr('value', '');
    }
});

$('textarea').blur(function(){
    if($(this).val() ===''){
        $(this).attr('value', placeholder);
    }    
});

Exemple: http://jsfiddle.net/airandfingers/pdXRx/247/

Pas du CSS pur et pas propre mais fait l'affaire.

Jason Gennaro
la source
4
je pourrais certainement simuler l'effet d'espace réservé en utilisant javascript, mais j'espérais quelque chose de plus simple
amosrivera
2
Malheureusement, @amosrivera, il ne semble y avoir aucun moyen standard: developer.mozilla.org/en/HTML/HTML5/… , autre qu'une solution de contournement scriptée.
Jason Gennaro
3
bonne solution, mais j'ajouterais if($(this).val() == 'This is...')au focusgestionnaire, sinon si vous ajoutez du texte, puis perdez le focus, puis cliquez à nouveau sur la zone de texte, votre texte disparaît.
Dennis Golomazov
2
@DenisGolomazov Bon ajout; Je viens de soumettre une modification avec le chèque dans le gestionnaire de focus. Je recommande également d'ajouter une classe d'espace réservé et de styliser les espaces réservés différemment, comme indiqué dans cette mise à jour de mon exemple jsfiddle modifié: jsfiddle.net/airandfingers/pdXRx/249
Aaron
Que faire si l'utilisateur a fait une entrée qui correspond exactement à celle du texte d'espace réservé, cela ne sera-t-il pas également effacé?
Arjuna
274

Vous pouvez insérer une nouvelle entité html de ligne &#10;à l'intérieur de l'attribut d'espace réservé:

<textarea name="foo" placeholder="hello you&#10;Second line&#10;Third line"></textarea>

Fonctionne sur: Chrome 62, IE10, Firefox 60

Ne fonctionne pas sur: Safari 11

https://jsfiddle.net/lu1s/bxkjLpag/2/

lu1s
la source
7
cela fait exactement ce que la question initiale demandait. pourquoi n'est-il pas voté plus haut? ça ne marche pas dans tous les navigateurs?
DaveAlger
9
@DaveAlger - En effet, ce n'est pas le cas. Je l'ai juste essayé dans FF et il imprime le &#10;littéralement, sans produire de caractère d'espacement. Voir developer.mozilla.org/en/HTML/HTML5/...
Merlyn Morgan-Graham
1
Fonctionne sur IE10 et Chrome 62.
miny1997
1
Fonctionne très bien dans les nouvelles versions de Firefox
ii iml0sto1
10
Fonctionne dans Firefox 60.
Rob Porter
57

Ne pensez pas que vous êtes autorisé à faire cela: http://www.w3.org/TR/html5/forms.html#the-placeholder-attribute

Le contenu pertinent (c'est moi qui souligne):

L'attribut d'espace réservé représente un bref indice (un mot ou une phrase courte) destiné à aider l'utilisateur à saisir des données lorsque le contrôle n'a aucune valeur. Un indice peut être un exemple de valeur ou une brève description du format attendu. L'attribut, s'il est spécifié, doit avoir une valeur qui ne contient aucun caractère U + 000A LINE FEED (LF) ou U + 000D CARRIAGE RETURN (CR).

Tieson T.
la source
@amosrivera Hmm. Eh bien, les vendeurs sont autorisés à interpréter les spécifications de la manière qu'ils jugent appropriée.
Tieson T.
10
im un outil, cela ressemblait à un
saut de
3
@amosrivera LOL, au moins tu peux en rire, non? Rien de perdu en essayant ...:]
Tieson T.
1
La réponse est correcte. mais je considère la règle comme un non-sens total. Quel est l'argument exact pour "ne doit pas contenir" LR ou CR?
Jens A. Koch
2
@ Jens-AndréKoch Je suppose que l'argument est qu'un espace réservé doit être simple; si la valeur est suffisamment complexe pour nécessiter des sauts de ligne, elle doit exister en tant qu'élément frère, similaire à ce que vous voyez si vous activez le lien "afficher l'aide" par cet éditeur de commentaires. Un espace réservé n'est pas visible une fois qu'une entrée contient du contenu, après tout ...
Tieson T.
54

MISE À JOUR (janvier 2016): Le joli petit hack pourrait ne plus fonctionner sur tous les navigateurs, j'ai donc une nouvelle solution avec un tout petit peu de javascript ci-dessous.


Un joli petit hack

Cela ne fait pas du bien, mais vous pouvez simplement mettre les nouvelles lignes dans le html. Comme ça:

<textarea rows="6" id="myAddress" type="text" placeholder="My Awesome House,
        1 Long St
        London
        Postcode
        UK"></textarea>

Notez que chaque ligne est sur une nouvelle ligne (non encapsulée) et chaque retrait de «tabulation» est de 4 espaces. Certes, ce n'est pas une très bonne méthode, mais cela semble fonctionner:

http://jsfiddle.net/01taylop/HDfju/

  • Il est probable que le niveau de retrait de chaque ligne varie en fonction de la largeur de votre zone de texte.
  • Il est important d'avoir resize: none;dans le css pour que la taille de la zone de texte soit fixe (voir jsfiddle).

Alternativement, lorsque vous voulez une nouvelle ligne, appuyez deux fois sur retour (il y a donc une ligne vide entre vos 'nouvelles lignes'. Cette 'ligne vide' créée doit avoir suffisamment de tabulations / espaces correspondant à la largeur de votre zone de texte. Il semble que peu importe si vous en avez beaucoup trop, vous en avez juste besoin. C'est tellement sale et probablement pas compatible avec le navigateur. J'aurais aimé qu'il y ait un moyen plus simple!


Une meilleure solution

Découvrez le JSFiddle .

  • Cette solution place un div derrière la zone de texte.
  • Certains javascript sont utilisés pour modifier la couleur d'arrière-plan de la zone de texte, masquant ou révélant l'espace réservé de manière appropriée.
  • Les entrées et les espaces réservés doivent avoir les mêmes tailles de police, d'où les deux mixins.
  • Les propriétés box-sizinget display: blockde la zone de texte sont importantes ou le div derrière celui-ci ne sera pas de la même taille.
  • Le réglage resize: verticalet un min-heightsur la zone de texte sont également importants - notez comment le texte de l'espace réservé sera enveloppé et l'agrandissement de la zone de texte conservera l'arrière-plan blanc. Cependant, commenter la resizepropriété entraînera des problèmes lors de l'expansion horizontale de la zone de texte.
  • Assurez-vous simplement que la hauteur minimale de la zone de texte est suffisante pour couvrir l'intégralité de votre espace réservé à sa plus petite largeur. **

Capture d'écran JSFiddle

HTML:

<form>
  <input type='text' placeholder='First Name' />
  <input type='text' placeholder='Last Name' />
  <div class='textarea-placeholder'>
    <textarea></textarea>
    <div>
      First Line
      <br /> Second Line
      <br /> Third Line
    </div>
  </div>
</form>

SCSS:

$input-padding: 4px;

@mixin input-font() {
  font-family: 'HelveticaNeue-Light', 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif;
  font-size: 12px;
  font-weight: 300;
  line-height: 16px;
}

@mixin placeholder-style() {
  color: #999;
  @include input-font();
}

* {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
}

form {
  width: 250px;
}

input,textarea {
  display: block;
  width: 100%;
  padding: $input-padding;
  border: 1px solid #ccc;
}

input {
  margin-bottom: 10px;
  background-color: #fff;

  @include input-font();
}

textarea {
  min-height: 80px;
  resize: vertical;
  background-color: transparent;
  &.data-edits {
    background-color: #fff;
  }
}

.textarea-placeholder {
  position: relative;
  > div {
    position: absolute;
    z-index: -1;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    padding: $input-padding;
    background-color: #fff;
    @include placeholder-style();
  }
}

::-webkit-input-placeholder {
  @include placeholder-style();
}
:-moz-placeholder {
  @include placeholder-style();
}
::-moz-placeholder {
  @include placeholder-style();
}
:-ms-input-placeholder {
  @include placeholder-style();
}

Javascript:

$("textarea").on('change keyup paste', function() {
  var length = $(this).val().length;
  if (length > 0) {
    $(this).addClass('data-edits');
  } else {
    $(this).removeClass('data-edits');
  }
});
Patrick
la source
Un hack très mignon. Cela fonctionne certainement dans Chrome. Pouvons-nous confirmer qu'il fonctionne de la même manière dans tous les autres principaux navigateurs?
Mark Amery
2
J'adorerais que quelqu'un le teste dans IE. Je peux confirmer que cela fonctionne sur les versions les plus récentes de Safari et Chrome, mais certainement pas sur Firefox. J'utilise maintenant du texte au lieu d'un espace réservé et j'ai une classe css pour que le texte ressemble à un espace réservé. Ensuite, une petite fonction jQuery pour effacer le texte quand il a le focus - ou le remettre s'il est vide!
Patrick
2
Fonctionne très bien dans Chrome et IE 11. Mais ne fonctionne pas avec le navigateur par défaut de Firefox et Android.
Programmeur chimique
1
Ne fonctionne pas sur Safari, Firefox, Opera. Fonctionne uniquement dans Chrome :(
avant le
1
Cela devrait être la réponse acceptée, car la réponse actuelle peut soumettre la valeur «espace réservé» avec le formulaire. Remarque: la solution sous «Une meilleure solution» fonctionne correctement dans tous les navigateurs. Les commentaires disant différents doivent se référer à "A Nice Little Hack".
Roy Prins
15

Que diriez-vous d'une solution CSS: http://cssdeck.com/labs/07fwgrso

::-webkit-input-placeholder::before {
  content: "FIRST\000ASECOND\000ATHIRD";
}

::-moz-placeholder::before {
  content: "FIRST\000ASECOND\000ATHIRD";
}

:-ms-input-placeholder::before {
  content: "FIRST\000ASECOND\000ATHIRD";
}
Samuli Hakoniemi
la source
2
C'est la meilleure solution de toutes celles énumérées ici, IMO.
aendrew
Cette solution ne fonctionne pas sous Firefox (testé sur 22.0-28.0b9).
Hartwig
@Hartwig J'ai en fait remarqué la même chose. Pour une raison quelconque, Firefox ne gère pas cela correctement. En fait, cela ne fonctionne pas non plus sur IE ==> malheureusement, c'est uniquement WebKit.
Samuli Hakoniemi
15

Salaamun Alekum

&#10;

Fonctionne pour Google Chrome

entrez la description de l'image ici

<textarea placeholder="Enter Choice#1 &#10;Enter Choice#2 &#10;Enter Choice#3"></textarea>

J'ai testé ceci sur Windows 10.0 (Build 10240) et Google Chrome Version 47.0.2526.80 m

08:43:08 AST 6 Rabi Al-Awwal, 1437 jeudi 17 décembre 2015

Merci

Ali Jamal
la source
10

Ajoutez seulement & # 10 pour casser la ligne, pas besoin d'écrire du CSS ou du javascript.

textarea{
    width:300px;
    height:100px;

}
<textarea placeholder='This is a line this &#10should be a new line'></textarea>

<textarea placeholder=' This is a line 

should this be a new line?'></textarea>

Sundaram Seth
la source
9

Ancienne réponse:

Non, vous ne pouvez pas faire cela dans l'attribut d'espace réservé. Vous ne pouvez même pas encoder html comme &#13;&#10;dans un espace réservé.

Nouvelle réponse:

Les navigateurs modernes vous offrent plusieurs façons de procéder. Voir ce JSFiddle:

http://jsfiddle.net/pdXRx/5/

Benjamin Udink ten Cate
la source
Violon utile! La solution 2 fonctionne réellement dans Safari.
sandinmyjoints le
7

Utiliser &#10;à la place de \ncela changera la ligne.

Jayant Rajwani
la source
2
Je pense que tu veux dire \n?
Script47 du
1
Génial! Je vous remercie!
Digerkam le
6

Essaye ça:

<textarea
placeholder="Line1&#x0a;&#x09;&#x09;&#x09;Line2"
cols="10"
rows="5"
style="resize:none">
</textarea>

http://jsfiddle.net/vr79B/


la source
Il s'agit simplement de tabuler un espace après la 1ère phrase et ne peut pas être utilisé sur plus de colonnes ou de largeur flexible.
Jeffrey Neo
5

Vous ne pouvez pas le faire avec du HTML pur, mais ce plugin jQuery vous permettra: https://github.com/bradjasper/jQuery-Placeholder-Newlines

devicenull
la source
Bien, j'ai travaillé pour moi, j'ai remplacé le jquery.placeholder standard par matthias par celui-ci et j'ai dû remplacer ces appels: $('input, textarea').placeholder();avec ceci$('input[placeholder], textarea[placeholder]').placeholder();
ryan2johnson9
4

Une version légèrement améliorée de la réponse de Jason Gennaro (voir les commentaires du code):

var placeholder = 'This is a line \nthis should be a new line';
$('textarea').attr('value', placeholder);
$('textarea').focus(function(){
    if($(this).val() == placeholder){
        // reset the value only if it equals the initial one    
        $(this).attr('value', '');
    }
});
$('textarea').blur(function(){
    if($(this).val() == ''){
        $(this).attr('value', placeholder);
    }    
});
// remove the focus, if it is on by default
$('textarea').blur();
Dennis Golomazov
la source
4

J'ai aimé le travail de Jason Gennaro et Denis Golomazov, mais je voulais quelque chose qui serait plus globalement utile. J'ai modifié le concept pour qu'il puisse être ajouté à n'importe quelle page sans répercussion.

http://jsfiddle.net/pdXRx/297/

<h1>Demo: 5 different textarea placeholder behaviors from a single JS</h1>

<h2>Modified behaviors</h2>

<!-- To get simulated placeholder with New Lines behavior,
     add the placeholdernl attribute -->

<textarea placeholdernl>    (click me to demo)
Johnny S. Fiddle
248 Fake St.
Atlanta, GA 30134</textarea>

<textarea placeholder='Address' placeholdernl>    (click me to demo)
Johnny S. Fiddle
248 Fake St.
Atlanta, GA 30134</textarea>

<h2>Standard behaviors</h2>

<textarea placeholder='Address'>    (delete me to demo)
Johnny S. Fiddle
248 Fake St.
Atlanta, GA 30134</textarea>

<textarea>    (delete me to demo)
Johnny S. Fiddle
248 Fake St.
Atlanta, GA 30134</textarea>

<textarea placeholder='Address'></textarea>

Le javascript est très simple

<script>
(function($){
var handleFocus = function(){
    var $this = $(this);
    if($this.val() === $this.attr('placeholdernl')){
        $this.attr('value', '');
        $this.css('color', '');
    }
};

var handleBlur = function(){
    var $this = $(this);
    if($this.val() == ''){
        $this.attr('value', $this.attr('placeholdernl'))
        $this.css('color', 'gray');
    }    
};

$('textarea[placeholdernl]').each(function(){
    var $this = $(this),
        value = $this.attr('value'),
        placeholder = $this.attr('placeholder');
    $this.attr('placeholdernl', value ? value : placeholder);
    $this.attr('value', '');
    $this.focus(handleFocus).blur(handleBlur).trigger('blur');
});
})(jQuery);
</script>
Bruno Bronosky
la source
2

HTML

<textarea data-placeholder="1111\n2222"></textarea>

JS

$('textarea[data-placeholder]').each(function(){
    var $this = $(this),
        placeholder = $this.data('placeholder'),
        placeholderSplit = placeholder.split('\\n');
    placeholder = placeholderSplit.join('\n');
    $this.focus(function(){
        var $this = $(this);
        if($this.val() === placeholder){
            $this.val('');
            // $this.removeClass('placeholder');
        }
    }).blur(function(){
        var $this = $(this);
        if($this.val() == '') {
            $this.val(placeholder);
            // $this.addClass('placeholder');
        }
    }).trigger('blur');
});
Cong Min
la source
1

J'ai modifié le violon de @Richard Bronosky comme ça .

Il est préférable d'utiliser un data-*attribut plutôt qu'un attribut personnalisé. J'ai remplacé <textarea placeholdernl>to <textarea data-placeholder>et quelques autres styles également.

édité
Voici la réponse originale de Richard qui contient un extrait de code complet.

Gongdo Gong
la source
1
Il est préférable que chaque fois que vous incluez un jsfiddle, expliquez et collez le code ici également, nous l'avons donc pour référence et nous n'avons pas à nous fier à ce que le contenu soit toujours dans jsfiddle.
avcajaraville
Vous avez raison, @avcajaraville. Mais je n'ai pas inclus l'extrait de code complet car la réponse originale de Richard est sur le même sujet, et la mienne n'est qu'une simple modification. Au lieu de cela, j'ai pointé sa réponse.
Gongdo Gong
1

très simple

  var position = your break position;
    var breakLine = "&#13;&#10;";//in html 
    var output = [value.slice(0, position), breakLine, value.slice(position)].join('');
    return output;

valeur représente la chaîne d'origine

éliprodigie
la source
1

Découvrez cette solution avec un espace réservé personnalisé.

  • Vous obtenez un espace réservé multiligne qui fonctionne dans tous les navigateurs (y compris Firefox)
  • Il est possible de personnaliser l'espace réservé comme vous le souhaitez

Démo sur violon .

$(document).on('input', '#textArea', function () {
	
        if ($('#textArea').val()) {
            $('#placeholderDiv').hide();
        } else {
            $('#placeholderDiv').show();
        }   
});
#textAreaWrap {
    position: relative;
    background-color: white;
}

#textArea {
    position: relative;
    z-index: 1;
    width: 350px;
    height: 100px;
    min-height: 100px;
    padding: 6px 12px;
    resize: vertical;
    background-color: transparent;
    /* When set background-color: transparent - Firefox  displays
    unpleasant textarea border. Set border style to fix it.*/
    border: 1px solid #a5a5a5;
}

#placeholderDiv {
    position: absolute;
    top: 0;
    padding: 6px 13px;
    color: #a5a5a5;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="textAreaWrap">
    
<textarea id="textArea"></textarea>

<!-- Check here. If textarea has content -
     set for this div attribute style="display: none;" -->
<div id="placeholderDiv">Multiline textarea<br>
                         placeholder<br>
                         <br>
                         that works in Firefox</div>
    
</div>

tropique
la source
0

Je n'aime pas cacher l'espace réservé lorsque vous concentrez la zone de texte. J'ai donc créé une fonction de constructeur Placeholderqui ressemble exactement à l'espace réservé intégré et qui fonctionne également dans d'autres navigateurs que Google Chrome. C'est très pratique car vous pouvez utiliser la Placeholderfonction aussi souvent que vous le souhaitez et elle n'a même pas besoin de jQuery.

ÉDITER:

Il gère désormais également correctement les cas particuliers, comme l'insertion de l'espace réservé.

var textarea = document.getElementById("textarea");
new Placeholder(textarea, "Line 1\nLine 2\nLine 3");

function Placeholder(el, placeholder) {
    if (el.value == "" || el.value == placeholder) {
        el.style.color = "gray";
        el.value = placeholder;
        el._plc = true;
        el.className += " unselectable";
    }
    function keyPress(e) {
        window.setTimeout(function() {
            var replaced = reverseStr(el.value).replace(reverseStr(placeholder), "");
            
            if (el.value == "") {
                el.value = placeholder;
                el.style.color = "gray";
                cursorToStart(el);
                el._plc = true;
                el.className += " unselectable";
            } else if (el._plc && el.value.endsWith(placeholder) && replaced !== "") {
                el.value = reverseStr(replaced);
                el.style.color = "black";
                el._plc = false;
                el.readOnly = false;
                el.className = el.className.replace("unselectable", "");
            } else if (el._plc && el.readOnly) {
                var ch = String.fromCharCode(e.charCode);
                if (e.keyCode == 13) ch = "\n";     // ENTER
                else if (e.charCode == 0) return;   // non-character keys
                
                el.value = ch;
                el.style.color = "black";
                el._plc = false;
                el.readOnly = false;
                el.className = el.className.replace("unselectable", "");
            }
        }, 10);
    }
    el.addEventListener("keypress", keyPress, false);
    el.addEventListener("paste", keyPress, false);
    el.addEventListener("cut", keyPress, false);
    el.addEventListener("mousedown", function() {
        if (el._plc) el.readOnly = true;
    }, false);
    el.addEventListener("mouseup", function() {
        el.readOnly = false;
        if (el._plc) cursorToStart(el);
    }, false);
  
    function cursorToStart(input) {
        if (input.createTextRange) {
            var part = input.createTextRange();
            part.move("character", 0);
            part.select();
        } else if (input.setSelectionRange){
            input.setSelectionRange(0, 0);
        } input.focus();
    }
    function reverseStr(str) {
        if (!str) return "";
        return str.split("").reverse().join("");
    }
}
textarea {
    border: 1px solid gray;
    padding: 3px 6px;
    font-family: Arial;
    font-size: 13px;
    transition: .2s;
}
textarea:hover, textarea:focus {
    border-color: #2277cc;
}
textarea:focus {
    box-shadow: inset 0 0 5px #85B7E9;
}
*.unselectable {
    -webkit-user-select: none;
    -webkit-touch-callout: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    -o-user-select: none;
}
<textarea id="textarea"></textarea>

Aloso
la source
0

Ce problème peut être résolu en utilisant le sélecteur affiché par espace réservé et les arrière-plans super-imposés, si votre implémentation le permet:

textarea:not(:placeholder-shown) {
  background: #fff;
}

div {
  top: 0;
  left: 14px;
  color: rgba(0,0,0,0.4);
  z-index: -1;
  position: absolute;
  line-height: 1.2;
  white-space: pre-wrap;
}

https://codepen.io/franciscoaquino/pen/YzyBPYK

Prise en charge du sélecteur:

https://caniuse.com/#feat=css-placeholder-shown

Francisco Aquino
la source