Czy możesz mieć wielowierszowy tekst zastępczy HTML5 w formacie a?

Mam tekst ducha w polach tekstowych, które znikają, gdy skupisz się na nich za pomocą atrybutu zastępczego HTML5:

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

Chcę użyć tego samego mechanizmu, aby mieć wielowierszowy tekst zastępczy w textarea, może coś takiego:

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

Ale te \npojawiają się w tekście i nie powodują nowych linii... Czy istnieje sposób na umieszczenie wielowierszowego elementu zastępczego?

aktualizacja: jedynym sposobem, aby to zadziałało, było użycie znaku wodnego jQuery wtyczka , która akceptuje HTML w tekście zastępczym:

$('.textarea_class').watermark('Enter story<br/> * newline', {fallback: false});
Author: at., 2011-08-25

13 answers

Specyfikacja nie pozwala na podawanie linii ani znaków powrotu karetki.

Atrybut zastępczy reprezentuje krótką podpowiedź (słowo lub krótki phrase) mające na celu ułatwienie użytkownikowi wprowadzania danych. Podpowiedź może być wartość próbki lub krótki opis oczekiwanego formatu. Na atrybut, jeśli jest określony, musi mieć wartość, która nie zawiera U+000A Linia FEED (LF) lub u+000d CARRIAGE RETURN (CR) znaków.

Najwyraźniej zalecenie jest używaj atrybutu title na cokolwiek dłużej.

Dla dłuższej podpowiedzi lub innego tekstu doradczego atrybut title jest bardziej odpowiednie.

Edytuj (1/8/18):

Dla <textarea> nie wydaje się, aby tak było. Specyfikacja określa, że karetka zwraca + podziały linii muszą być renderowane jako takie przez przeglądarkę.

Agenci użytkownika powinni przedstawić tę podpowiedź użytkownikowi, gdy wartość elementu jest pustym łańcuchem znaków, a kontrolka nie jest focused (np. poprzez wyświetlenie go wewnątrz pustego kontrolki unfocused). Wszystkie U+000d CARRIAGE RETURN u+000A line FEED character pairs (CRLF) w podpowiedzi, jak również wszystkie pozostałe znaki u+000d CARRIAGE RETURN (CR) i U+000A LINE FEED (LF) w podpowiedzi, muszą być traktowane jako podziały linii podczas renderowania podpowiedzi.

Zobacz dokumenty: http://w3c.github.io/html/sec-forms.html#element-attrdef-textarea-placeholder
Również na MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea

FWIW, kiedy przymierzam Chrome 63.0.3239.132, to rzeczywiście działa tak, jak mówi, że powinien.

 72
Author: Ionuț G. Stan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 04:54:24

Na większości (Zobacz szczegóły poniżej) przeglądarek, edycja elementu zastępczego w javascript do pozwala na wielowierszowy Element Zastępczy. Jak już zostało powiedziane, nie jest zgodny ze specyfikacją i nie powinieneś oczekiwać, że będzie działać w przyszłości (edit: it does work).

Ten przykład zastępuje wszystkie Wielowierszowe pola tekstowe.

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

Oczekiwany wynik


Na podstawie komentarzy wydaje się, że jakaś przeglądarka akceptuje ten hack, a inne Nie.
Jest to wynik testów, które przeprowadziłem (z browsertshots i browserstack )

  • Chrome: > = 35.0.1916.69
  • Firefox: > = 35.0 (wyniki różnią się w zależności od platformy)
  • IE: >= 10
  • przeglądarki oparte na KHTML: 4.8
  • [[24]}Safari: nie (testowane = Safari 8.0.6 Mac OS X 10.8)
  • Opera: No (tested

Bazuje na statystyce , oznacza to, że działa na około 88.7% obecnie (Październik 2015) używane przeglądarki.

Update: Dzisiaj działa na co najmniej 94.4% obecnie (lipiec 2018) używane przeglądarki.

 62
Author: Cyrbil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 08:31:26

Uważam, że jeśli użyjesz dużej ilości spacji, przeglądarka zawiąże ją poprawnie. Nie martw się o użycie dokładnej liczby spacji, po prostu wrzuć tam dużo, a przeglądarka powinna prawidłowo zawijać do pierwszego znaku bez spacji w następnej linii.

<textarea name="address" placeholder="1313 Mockingbird Ln         Saginaw, MI 45100"></textarea>
 58
Author: Thomas Hunter II,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-12 23:06:12

Jest rzeczywiście hack, który umożliwia dodawanie wielowierszowych elementów zastępczych w przeglądarkach Webkit, Chrome kiedyś działał, ale w nowszych wersjach usunięto go:


Najpierw dodaj pierwszą linię placeholdera do html5 jak zwykle

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

Następnie dodaj resztę linii za pomocą css:

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

Jeśli chcesz zachować swoje linie w jednym miejscu, możesz spróbować następujących. Minusem tego jest to, że inne przeglądarki niż chrome, safari, webkit-itp. nawet nie pokazuj pierwszy wiersz:

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

Następnie dodaj resztę linii za pomocą css:

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

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

Demo Fiddle

Byłoby bardzo dobrze, gdyby s. o. mógł dostać podobne demo działające na Firefoksie.

 23
Author: Gottox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-23 11:15:15

Specyfikacja HTML5 wyraźnie odrzuca nowe linie w polu place holder. Wersje Webkit / będą / wstawiać nowe wiersze, gdy zostaną przedstawione z kanałami line feeds w miejscu zastępczym, jednak jest to nieprawidłowe zachowanie i nie należy na tym polegać.

Chyba akapity nie są wystarczająco krótkie na w3 ;)

 4
Author: Silent Penguin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-25 11:27:49

Jeśli twoja textarea ma statyczną szerokość, możesz użyć kombinacji nierozłamujących spacji i automatycznego owijania obszaru tekstowego. Po prostu zamień spacje na nbsp dla każdej linii i upewnij się, że dwie sąsiadujące linie nie pasują do jednej. W praktyce line length > cols/2.

To nie jest najlepszy sposób, ale może być jedynym rozwiązaniem między przeglądarkami.

<textarea class="textAreaMultiligne" 
          placeholder="Hello,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; This&nbsp;is&nbsp;multiligne&nbsp;example Have&nbsp;Fun&nbsp;&nbsp;&nbsp;&nbsp;"
          rows="5" cols="35"></textarea>
 2
Author: Krzysiek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-12 10:38:20

Jeśli używasz AngularJS, możesz po prostu użyć szelek, aby umieścić w nim cokolwiek chcesz: Oto skrzypce.

<textarea rows="6" cols="45" placeholder="{{'Address Line1\nAddress Line2\nCity State, Zip\nCountry'}}"></textarea>
 2
Author: ross_troha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-30 16:29:45

Możesz spróbować użyć CSS, to działa dla mnie. Atrybut placeholder=" " jest tutaj wymagany.

<textarea id="myID" placeholder=" "></textarea>
<style>
#myID::-webkit-input-placeholder::before {
    content: "1st line...\A2nd line...\A3rd line...";
}
</style>
 1
Author: Jeffrey Neo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-08 16:23:45

Myślę, że nie jest to możliwe tylko z html / css. Może być możliwe użycie JavaScript lub innego rodzaju hack-dodatkowe spacje, aby przesunąć tekst do następnej linii, itp.

 0
Author: TLD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-25 11:20:32

Bootstrap + contenteditable + multiline placeholder

Demo: https://jsfiddle.net/39mptojs/4/

Na podstawie odpowiedzi @ cyrbil i @ daniel

Używanie Bootstrap, jQuery i https://github.com/gr2m/bootstrap-expandable-input aby włączyć symbol zastępczy w contenteditable.

Używając" placeholder replace "javascript i dodając" white-space: pre " do css, multiline placeholder jest pokazane.

Html:

<div class="form-group">
    <label for="exampleContenteditable">Example contenteditable</label>
    <div id="exampleContenteditable" contenteditable="true" placeholder="test\nmultiple line\nhere\n\nTested on Windows in Chrome 41, Firefox 36, IE 11, Safari 5.1.7 ...\nCredits StackOveflow: .placeholder.replace() trick, white-space:pre" class="form-control">
    </div>
</div>

Javascript:

$(document).ready(function() {
    $('div[contenteditable="true"]').each(function() {
        var s=$(this).attr('placeholder');
        if (s) {
            var s1=s.replace(/\\n/g, String.fromCharCode(10));
            $(this).attr('placeholder',s1);
        }
    });
});

Css:

.form-control[contenteditable="true"] {
    border:1px solid rgb(238, 238, 238);
    padding:3px 3px 3px 3px;
    white-space: pre !important;
    height:auto !important;
    min-height:38px;
}
.form-control[contenteditable="true"]:focus {
    border-color:#66afe9;
}
 0
Author: Miha Pirnat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-11 19:35:37

W php z funkcją chr (13):

echo '<textarea class="form-control" rows="5" style="width:100%;" name="responsable" placeholder="NOM prénom du responsable légal'.chr(13).'Adresse'.chr(13).'CP VILLE'.chr(13).'Téléphone'.chr(13).'Adresse de messagerie" id="responsable"></textarea>';
 0
Author: Vlad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-01 12:29:34

React:

Jeśli używasz Reacta, możesz to zrobić w następujący sposób:

placeholder={'Address Line1\nAddress Line2\nCity State, Zip\nCountry'}
 0
Author: firetiger77,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-08 22:17:23

Rozwiązanie znaku wodnego w oryginalnym poście działa świetnie. Dzięki za to. W razie gdyby ktoś tego potrzebował, oto kanciasta dyrektywa.

(function () {
  'use strict';

  angular.module('app')
    .directive('placeholder', function () {
      return {
        restrict: 'A',
        link:     function (scope, element, attributes) {
          if (element.prop('nodeName') === 'TEXTAREA') {
            var placeholderText = attributes.placeholder.trim();

            if (placeholderText.length) {
              // support for both '\n' symbol and an actual newline in the placeholder element
              var placeholderLines = Array.prototype.concat
                .apply([], placeholderText.split('\n').map(line => line.split('\\n')))
                .map(line => line.trim());

              if (placeholderLines.length > 1) {
                element.watermark(placeholderLines.join('<br>\n'));
              }
            }
          }
        }
      };
    });
}());
 -1
Author: Yura Fedoriv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 13:29:08