Zeilenumbruch in Platzhalterattribut eines Textbereichs einfügen?


177

Ich habe ein paar Ansätze ausprobiert, aber keiner hat funktioniert. Kennt jemand den raffinierten Trick, um das zu umgehen?

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

UPDATE: Es funktioniert nicht in Chrom. Es war nur die Breite des Textbereichs.

Siehe: http://jsfiddle.net/pdXRx/


2
Wenn Sie PHP verwenden, können Sie <?="\n"?>als neue Zeile setzen
rybo111

39
Fügen Sie einfach &#10;das Platzhalterattribut hinzu, z <textarea placeholder="This is a line&#10;This is another one"></textarea>. Die Antwort ist unten.
Lu1s

4
@ lu1s Dies funktioniert in Chrome, IE, aber nicht in Firefox und Safari.
mb21

1
@ mb21 Ich habe es vor einer Minute in Firefox 60.0.2 getestet und jetzt funktioniert es. Vielleicht würde es jetzt in den meisten Browsern funktionieren.
Tsuma534

3
Es ist 2020 und immer noch keine Lösung für Safari?
Ömer An

Antworten:


61

Sie können den Text als hinzufügen value, wobei der Zeilenumbruch berücksichtigt wird \n.

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

Dann können Sie es entfernen focusund wieder auftragen (falls leer) blur. Etwas wie das

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

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

Nicht reines CSS und nicht sauber, aber macht den Trick.


4
Ich könnte den Platzhalter-Effekt sicherlich mit Javascript vortäuschen, aber ich hoffte auf etwas Einfacheres
Amosrivera

2
Leider, @amosrivera, scheint es keinen Standardweg zu geben: developer.mozilla.org/en/HTML/HTML5/… , außer einer skriptbasierten Problemumgehung .
Jason Gennaro

3
Gute Lösung, aber ich würde if($(this).val() == 'This is...')sie dem focusHandler hinzufügen . Andernfalls, wenn Sie Text hinzufügen, dann den Fokus verlieren und erneut auf den Textbereich klicken, verschwindet Ihr Text.
Dennis Golomazov

2
@ DenisGolomazov Gute Ergänzung; Ich habe gerade eine Bearbeitung mit dem Häkchen im Fokus-Handler eingereicht. Ich empfehle außerdem, eine Platzhalterklasse hinzuzufügen und Platzhalter anders zu gestalten, wie in diesem Update zu meinem modifizierten jsfiddle-Beispiel gezeigt: jsfiddle.net/airandfingers/pdXRx/249
Aaron

Was passiert, wenn der Benutzer Eingaben gemacht hat, die genau mit denen des Platzhaltertextes übereinstimmen? Wird dies nicht auch gelöscht?
Arjuna

270

Sie können eine neue HTML-Zeilenentität &#10;in das Platzhalterattribut einfügen :

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

Funktioniert auf: Chrome 62, IE10, Firefox 60

Funktioniert nicht bei: Safari 11

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


6
Dies macht genau das, was die ursprüngliche Frage verlangt hat. warum wird es nicht höher gewählt? funktioniert es nicht in jedem Browser?
DaveAlger

9
@ DaveAlger - In der Tat nicht. Ich habe es gerade in FF ausprobiert und es druckt das &#10;buchstäblich aus, ohne ein Leerzeichen zu erzeugen. Siehe developer.mozilla.org/en/HTML/HTML5/…
Merlyn Morgan-Graham

1
Funktioniert auf IE10 und Chrome 62.
miny1997

1
Funktioniert sehr gut in neueren Versionen von Firefox
ii iml0sto1

10
Funktioniert in Firefox 60.
Rob Porter

57

Denken Sie nicht, dass Sie das dürfen: http://www.w3.org/TR/html5/forms.html#the-placeholder-attribute

Der relevante Inhalt (Schwerpunkt Mine):

Das Platzhalterattribut stellt einen kurzen Hinweis (ein Wort oder eine kurze Phrase) dar, der den Benutzer bei der Dateneingabe unterstützen soll, wenn das Steuerelement keinen Wert hat. Ein Hinweis kann ein Beispielwert oder eine kurze Beschreibung des erwarteten Formats sein. Das Attribut muss, falls angegeben, einen Wert haben, der keine Zeichen für U + 000A LINE FEED (LF) oder U + 000D CARRIAGE RETURN (CR) enthält.


@amosrivera Hmm. Nun, Anbieter dürfen die Spezifikation so interpretieren, wie sie es für richtig halten.
Tieson T.

10

3
@amosrivera LOL, zumindest kannst du darüber lachen, oder? Nichts verloren durch den Versuch ...:]
Tieson T.

1
Die Antwort ist richtig. aber ich halte die Regel für totalen Unsinn. Was ist das genaue Argument für "darf nicht enthalten" LR oder CR?
Jens A. Koch

2
@ Jens-AndréKoch Ich gehe davon aus, dass ein Platzhalter einfach sein sollte. Wenn der Wert komplex genug ist, um Zeilenumbrüche zu benötigen, sollte er als Geschwisterelement vorhanden sein, ähnlich wie Sie es sehen, wenn Sie den Link "Hilfe anzeigen" in diesem Kommentareditor aktivieren. Ein Platzhalter ist schließlich nicht sichtbar, wenn eine Eingabe Inhalt enthält ...
Tieson T.

53

UPDATE (Jan 2016): Der nette kleine Hack funktioniert möglicherweise nicht mehr in allen Browsern, daher habe ich unten eine neue Lösung mit ein wenig Javascript.


Ein schöner kleiner Hack

Es fühlt sich nicht gut an, aber Sie können einfach die neuen Zeilen in den HTML-Code einfügen. So was:

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

Beachten Sie, dass sich jede Zeile in einer neuen Zeile befindet (nicht umbrochen wird) und jeder Tabulator-Einzug 4 Leerzeichen enthält. Zugegeben, es ist keine sehr schöne Methode, aber es scheint zu funktionieren:

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

  • Es ist wahrscheinlich, dass die Einrückungsstufe jeder Zeile abhängig von der Breite Ihres Textbereichs variiert.
  • Es ist wichtig, resize: none;in der CSS zu haben, damit die Größe des Textbereichs festgelegt ist (siehe jsfiddle).

Alternativ Wenn Sie eine neue Linie wollen, drücken die Eingabetaste zweimal (So gibt es eine leere Zeile zwischen ‚neuen Linien‘. Diese ‚leere Zeile‘ erstellt Bedürfnisse genug tabs / Räume aufweisen, die der Breite des Textbereich entsprechen würde. Es spielt keine Es scheint nicht wichtig zu sein, wenn Sie viel zu viele haben, Sie brauchen nur genug. Dies ist jedoch so schmutzig und wahrscheinlich nicht browserkonform. Ich wünschte, es gäbe einen einfacheren Weg!


Eine bessere Lösung

Schauen Sie sich die JSFiddle an .

  • Diese Lösung positioniert ein Div hinter dem Textbereich.
  • Etwas Javascript wird verwendet, um die Hintergrundfarbe des Textbereichs zu ändern und den Platzhalter entsprechend auszublenden oder freizulegen.
  • Die Eingaben und Platzhalter müssen die gleichen Schriftgrößen haben, daher die beiden Mixins.
  • Die box-sizingund display: block-Eigenschaften im Textbereich sind wichtig, oder das dahinterliegende Div ist nicht gleich groß.
  • Die Einstellung resize: verticalund ein min-heightZeichen im Textbereich sind ebenfalls wichtig. Beachten Sie, wie der Platzhaltertext umbrochen wird und das Erweitern des Textbereichs den weißen Hintergrund beibehält. Das Auskommentieren der resizeEigenschaft führt jedoch zu Problemen beim horizontalen Erweitern des Textbereichs.
  • Stellen Sie einfach sicher, dass die Mindesthöhe auf dem Textbereich ausreicht, um Ihren gesamten Platzhalter in seiner kleinsten Breite abzudecken. **

JSFiddle Screenshot

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

Ein sehr süßer Hack. Dies funktioniert definitiv in Chrome. Können wir bestätigen, dass es in allen anderen gängigen Browsern gleich funktioniert?
Mark Amery

2
Ich würde jemanden lieben, der es im IE testet. Ich kann bestätigen, dass es auf den neuesten Versionen von Safari und Chrome funktioniert, aber definitiv nicht auf Firefox. Ich verwende jetzt Text anstelle von Platzhaltern und habe eine CSS-Klasse, damit der Text wie ein Platzhalter aussieht. Dann eine kleine jQuery-Funktion, um den Text zu löschen, wenn er fokussiert ist - oder ihn zurückzusetzen, wenn er leer ist!
Patrick

2
Funktioniert gut in Chrome und IE 11. Funktioniert jedoch nicht in Firefox und Android Standardbrowser.
Chemischer Programmierer

1
Funktioniert nicht mit Safari, Firefox, Opera. Funktioniert nur in Chrome :(
bis zum

1
Dies sollte die akzeptierte Antwort sein, da die aktuelle Antwort den "Platzhalter" -Wert mit dem Formular senden kann. Hinweis: Die Lösung unter "Eine bessere Lösung" funktioniert browserübergreifend korrekt. Die Kommentare, die anders sagen, müssen sich auf "A Nice Little Hack" beziehen.
Roy Prins

15

Wie wäre es mit einer CSS-Lösung: 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
Dies ist die beste Lösung aller hier aufgeführten, IMO.
Aendrew

Diese Lösung funktioniert nicht in Firefox (getestet am 22.0-28.0b9).
Hartwig

@ Hartwig Mir ist das eigentlich aufgefallen. Aus irgendeinem Grund geht Firefox nicht richtig damit um. Eigentlich funktioniert es auch nicht im IE ==> leider ist es nur WebKit.
Samuli Hakoniemi

14

Salaamun Alekum

&#10;

Funktioniert für Google Chrome

Geben Sie hier die Bildbeschreibung ein

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

Ich habe dies unter Windows 10.0 (Build 10240) und Google Chrome Version 47.0.2526.80 m getestet

08:43:08 AST 6 Rabi Al-Awwal, 1437 Donnerstag, 17. Dezember 2015

Danke


10

Fügen Sie nur & # 10 hinzu, um die Linie zu brechen. Sie müssen kein CSS oder Javascript schreiben.

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

Alte Antwort:

Nein, das können Sie im Platzhalterattribut nicht tun. Sie können nicht einmal HTML-Zeilenumbrüche wie &#13;&#10;in einem Platzhalter codieren .

Neue Antwort:

Moderne Browser bieten Ihnen verschiedene Möglichkeiten, dies zu tun. Siehe diese JSFiddle:

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


Hilfreiche Geige! Lösung 2 funktioniert tatsächlich in Safari.
Sandinmyjoints


6

Versuche dies:

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

http://jsfiddle.net/vr79B/


Dies ist nur ein wenig Platz nach dem ersten Satz und kann nicht für mehr Spalten oder eine flexible Breite verwendet werden.
Jeffrey Neo


4

Eine leicht verbesserte Version der Antwort von Jason Gennaro (siehe Codekommentare):

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

Ich mochte die Arbeit von Jason Gennaro und Denis Golomazov, aber ich wollte etwas, das global nützlicher wäre. Ich habe das Konzept so geändert, dass es ohne Auswirkungen zu jeder Seite hinzugefügt werden kann.

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>

Das Javascript ist sehr einfach

<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

Ich habe @Richard Bronoskys Geige so modifiziert .

Es ist besser, ein data-*Attribut als ein benutzerdefiniertes Attribut zu verwenden. Ich <textarea placeholdernl>habe auch <textarea data-placeholder>einige andere Stile ersetzt.

bearbeitet
Hier ist die ursprüngliche Antwort von Richard, die den vollständigen Code-Ausschnitt enthält.


1
Es ist besser, wenn Sie eine jsfiddle einfügen, den Code auch hier zu erklären und einzufügen, damit wir ihn als weitere Referenz haben und uns nicht darauf verlassen müssen, dass der Inhalt für immer in jsfiddle enthalten sein wird.
Avcajaraville

Sie haben Recht, @avcajaraville. Aber ich habe kein vollständiges Code-Snippet eingefügt, da Richards ursprüngliche Antwort sich auf dasselbe Thema bezieht und meine nur eine einfache Änderung ist. Stattdessen zeigte ich auf seine Antwort.
Gongdo Gong

1

sehr einfach

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

Wert repräsentiert die ursprüngliche Zeichenfolge


1

Testen Sie diese Lösung mit einem benutzerdefinierten Platzhalter.

  • Sie erhalten einen mehrzeiligen Platzhalter, der in allen Browsern (einschließlich Firefox) funktioniert.
  • Es ist möglich, Platzhalter nach Ihren Wünschen anzupassen

Demo auf Geige .

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

Ich mag es nicht, den Platzhalter zu verstecken, wenn Sie den Textbereich fokussieren. Deshalb habe ich eine Konstruktorfunktion erstellt Placeholder, die genau wie der integrierte Platzhalter aussieht und auch in anderen Browsern als Google Chrome funktioniert. Dies ist sehr praktisch, da Sie die PlaceholderFunktion so oft verwenden können, wie Sie möchten, und nicht einmal jQuery benötigen.

BEARBEITEN:

Es behandelt jetzt auch Sonderfälle wie das korrekte Einfügen des Platzhalters.

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>


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.