Inserire un'interruzione di riga all'interno dell'attributo segnaposto di un'area di testo?


179

Ho provato alcuni approcci ma nessuno ha funzionato. Qualcuno conosce un trucco intelligente per aggirare questo?

<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 -->

AGGIORNAMENTO: non funziona in Chrome. Era solo la larghezza della textarea.

Vedi: http://jsfiddle.net/pdXRx/


2
Se si utilizza PHP, è possibile inserire <?="\n"?>come nuova riga
rybo111,

39
Aggiungi &#10;l'attributo segnaposto, ad esempio <textarea placeholder="This is a line&#10;This is another one"></textarea>. La risposta è in basso.
lu1s

4
@ lu1s funziona in Chrome, IE ma non in Firefox e Safari.
mb21

1
@ mb21 L'ho provato un minuto fa in Firefox 60.0.2 e ora funziona. Forse ora funzionerebbe nella maggior parte dei browser.
tsuma534,

3
È il 2020 e non hai ancora una soluzione per Safari?
Ömer Un

Risposte:


61

Quello che potresti fare è aggiungere il testo come value, che rispetta l'interruzione di riga \n.

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

Quindi è possibile rimuoverlo focuse applicarlo nuovamente (se vuoto) sublur . Qualcosa come questo

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);
    }    
});

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

Non puro CSS e non pulito ma fa il trucco.


4
potrei certamente simulare l'effetto segnaposto usando JavaScript, ma speravo in qualcosa di più semplice
amosrivera,

2
Sfortunatamente, @amosrivera, non sembra esserci un modo standard: developer.mozilla.org/en/HTML/HTML5/… , a parte una soluzione alternativa tramite script.
Jason Gennaro,

3
buona soluzione, ma aggiungerei if($(this).val() == 'This is...')al focusgestore, altrimenti se aggiungi del testo, quindi perdi lo stato attivo, quindi fai di nuovo clic nell'area di testo, il testo scompare.
Dennis Golomazov,

2
@DenisGolomazov Buona aggiunta; Ho appena inviato una modifica con il segno di spunta nel gestore della messa a fuoco. Consiglio anche di aggiungere una classe di segnaposto e di dare uno stile diverso ai segnaposto, come mostrato in questo aggiornamento al mio esempio jsfiddle modificato: jsfiddle.net/airandfingers/pdXRx/249
Aaron,

Che cosa succede se l'utente ha inserito un input che corrisponde esattamente a quello del testo segnaposto, non verrà cancellato anche quello?
Arjuna,

277

È possibile inserire una nuova entità html di riga &#10;all'interno dell'attributo segnaposto:

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

Funziona su: Chrome 62, IE10, Firefox 60

Non funziona su: Safari 11

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


7
questo fa esattamente ciò che la domanda originale ha chiesto. perché non è votato più in alto? non funziona in tutti i browser?
DaveAlger,

9
@DaveAlger - In effetti no. L'ho appena provato in FF e stampa &#10;letteralmente, senza produrre un carattere di spazi bianchi. Vedi developer.mozilla.org/it/HTML/HTML5/…
Merlyn Morgan-Graham,

1
Funziona su IE10 e Chrome 62.
miny1997,

1
Funziona molto bene con le versioni più recenti di Firefox
ii iml0sto1

10
Funziona con Firefox 60.
Rob Porter,

57

Non pensare che ti sia permesso farlo: http://www.w3.org/TR/html5/forms.html#the-placeholder-attribute

Il contenuto pertinente (il mio accento è mio):

L'attributo segnaposto rappresenta un suggerimento breve (una parola o una frase breve) inteso ad aiutare l'utente con l'immissione dei dati quando il controllo non ha valore. Un suggerimento potrebbe essere un valore di esempio o una breve descrizione del formato previsto. L'attributo, se specificato, deve avere un valore che non contiene caratteri U + 000A LINE FEED (LF) o U + 000D CARRIAGE RETURN (CR).


@amosrivera Hmm. Bene, i venditori possono interpretare le specifiche nel modo che ritengono opportuno.
Tieson T.

10
Sono uno strumento, sembrava una linea di rottura ma in realtà era solo il segnaposto che si avvolgeva attorno alla larghezza della textarea ..
amosrivera,

3
@amosrivera LOL, almeno puoi riderci, vero? Nulla ha perso provando ...:]
Tieson T.

1
La risposta è corretta ma considero la regola totalmente senza senso. Qual è l'argomento esatto per "non deve contenere" LR o CR?
Jens A. Koch,

2
@ Jens-AndréKoch Suppongo che l'argomento sia che un segnaposto dovrebbe essere semplice; se il valore è abbastanza complesso da richiedere interruzioni di riga, dovrebbe esistere come elemento fratello, simile a quello che vedi se attivi il link "mostra aiuto" da questo editor di commenti. Un segnaposto non è visibile una volta che un input contiene contenuti, dopo tutto ...
Tieson T.

54

AGGIORNAMENTO (gennaio 2016): il piccolo hack potrebbe non funzionare più su tutti i browser, quindi ho una nuova soluzione con un po 'di javascript di seguito.


Un bel piccolo hack

Non è piacevole, ma puoi semplicemente inserire le nuove righe nel codice HTML. Come questo:

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

Si noti che ogni riga si trova su una nuova riga (non essere racchiusa) e ogni rientro della "scheda" è di 4 spazi. Concesso che non è un metodo molto carino, ma sembra funzionare:

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

  • È probabile che il livello di rientro di ciascuna riga varierà in base alla larghezza dell'area di testo.
  • È importante avere resize: none;nel CSS in modo che la dimensione della textarea sia fissa (Vedi jsfiddle).

In alternativa, quando vuoi una nuova linea, premi Invio due volte (Quindi c'è una linea vuota tra le tue "nuove linee". Questa "linea vuota" creata deve avere schede / spazi sufficienti che corrispondano alla larghezza della tua area di testo. non importa se ne hai troppi, ne hai solo bisogno. È così sporco, ma probabilmente non conforme al browser. Vorrei che ci fosse un modo più semplice!


Una soluzione migliore

Dai un'occhiata al JSFiddle .

  • Questa soluzione posiziona un div dietro la textarea.
  • Alcuni javascript vengono utilizzati per modificare il colore di sfondo dell'area di testo, nascondendo o rivelando il segnaposto in modo appropriato.
  • Gli input e i segnaposto devono avere le stesse dimensioni dei caratteri, quindi i due mixin.
  • Le proprietà box-sizinge display: blocknell'area di testo sono importanti o il div dietro non avrà le stesse dimensioni.
  • Anche l'impostazione resize: verticale a min-heightnell'area di testo sono importanti: nota come il testo segnaposto verrà spostato e l'espansione dell'area di testo manterrà lo sfondo bianco. Tuttavia, commentare la resizeproprietà causerà problemi durante l'espansione orizzontale dell'area di testo.
  • Assicurati solo che l'altezza minima nell'area di testo sia sufficiente per coprire l'intero segnaposto alla sua larghezza minima. **

Schermata di 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');
  }
});

Un trucco molto carino. Questo funziona sicuramente in Chrome. Possiamo confermare che funzioni allo stesso modo in tutti gli altri principali browser?
Mark Amery,

2
Vorrei che qualcuno lo testasse in IE. Posso confermare che funziona con le versioni più recenti di Safari e Chrome ma sicuramente non Firefox. Ora uso il testo anziché il segnaposto e ho una classe CSS per rendere il testo simile a un segnaposto. Quindi una piccola funzione jQuery per cancellare il testo quando è attivo - o rimetterlo se vuoto!
Patrick,

2
Funziona bene su Chrome e IE 11. Ma non funziona su Firefox e browser predefinito Android.
Programmatore chimico

1
Non funziona su Safari, Firefox, Opera. Funziona solo su Chrome :(
entro il

1
Questa dovrebbe essere la risposta accettata, perché quella corrente può inviare il valore "segnaposto" con il modulo. Nota: la soluzione in "Una soluzione migliore" funziona correttamente tra browser. I commenti che dicono diversi devono fare riferimento a "A Nice Little Hack".
Roy Prins,

15

Che ne dici di una soluzione 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";
}

2
Questa è la migliore soluzione di tutte quelle elencate qui, IMO.
Annunciato il

Questa soluzione non funziona in Firefox (testato su 22.0-28.0b9).
Hartwig,

@Hartwig In realtà ho notato lo stesso. Per qualche ragione Firefox non lo gestisce correttamente. In realtà non funziona neanche su IE ==> sfortunatamente è solo WebKit.
Samuli Hakoniemi,

15

Salaamun Alekum

&#10;

Funziona per Google Chrome

inserisci qui la descrizione dell'immagine

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

Ho provato questo su Windows 10.0 (Build 10240) e Google Chrome versione 47.0.2526.80 m

08:43:08 AST 6 Rabi Al-Awwal, 1437 giovedì, 17 dicembre 2015

Grazie


10

Aggiungi solo & # 10 per la linea di interruzione, non è necessario scrivere CSS o 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>


9

Vecchia risposta:

No, non puoi farlo nell'attributo segnaposto. Non puoi nemmeno html codificare nuove righe come &#13;&#10;in un segnaposto.

Nuova risposta:

I browser moderni offrono diversi modi per farlo. Vedi questo JSFiddle:

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


Violino utile! La soluzione 2 in realtà funziona in Safari.
sandinmyjoints


6

Prova questo:

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

http://jsfiddle.net/vr79B/


Questo è solo uno spazio di tabulazione dopo la prima frase e non può essere utilizzato su più colonne o larghezza flessibile.
Jeffrey Neo,


4

Una versione leggermente migliorata della risposta di Jason Gennaro (vedi commenti in codice):

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();

4

Mi è piaciuto il lavoro di Jason Gennaro e Denis Golomazov, ma volevo qualcosa che sarebbe stato più utile a livello globale. Ho modificato il concetto in modo che possa essere aggiunto a qualsiasi pagina senza ripercussioni.

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>

Il javascript è molto semplice

<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>

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');
});


1

Ho modificato il violino di @Richard Bronosky in questo modo .

È un approccio migliore per utilizzare l' data-*attributo piuttosto che un attributo personalizzato. Ho sostituito <textarea placeholdernl>anche <textarea data-placeholder>alcuni altri stili.

modificato
Ecco la risposta originale di Richard che contiene lo snippet di codice completo.


1
È meglio che ogni volta che includi un jsfiddle, spiega e incolla anche qui il codice, quindi lo abbiamo per ulteriori riferimenti e non dobbiamo fare affidamento sul fatto che il contenuto rimarrà per sempre in jsfiddle.
avcajaraville,

Hai ragione, @avcajaraville. Ma non ho incluso lo snippet di codice completo poiché la risposta originale di Richard è sullo stesso argomento e la mia è solo una semplice modifica. Invece, ho indicato la sua risposta.
Gongdo Gong,

1

molto semplice

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

valore rappresenta la stringa originale


1

Dai un'occhiata a questa soluzione con segnaposto personalizzato.

  • Ottieni segnaposto multilinea che funziona in tutti i browser (incluso Firefox)
  • È possibile personalizzare il segnaposto come desideri

Demo sul violino .

$(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>


0

Non mi piace nascondere il segnaposto quando si concentra l'area di testo. Quindi ho creato una funzione di costruzione Placeholderche assomiglia esattamente al segnaposto incorporato e funziona anche con browser diversi da Google Chrome. È molto comodo perché puoi usare la Placeholderfunzione tutte le volte che vuoi e non ha nemmeno bisogno di jQuery.

MODIFICARE:

Ora gestisce anche casi speciali, come l'inserimento del segnaposto, correttamente.

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>


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.