Wstawić podział wiersza wewnątrz atrybutu zastępczego obszaru tekstowego?


179

Wypróbowałem kilka podejść, ale żadna nie działała. Czy ktoś zna sprytną sztuczkę, aby to obejść?

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

AKTUALIZACJA: Nie działa w Chrome. To była tylko szerokość obszaru tekstowego.

Zobacz: http://jsfiddle.net/pdXRx/


2
Jeśli używasz PHP, możesz wstawić <?="\n"?>jako nową linię
rybo111

39
Po prostu dodaj &#10;atrybut zastępczy, taki jak <textarea placeholder="This is a line&#10;This is another one"></textarea>. Odpowiedź znajduje się poniżej.
lu1s

4
@ lu1s działa to w Chrome, IE, ale nie w Firefoksie i Safari.
mb21

1
@ mb21 Przetestowałem to minutę temu w Firefoksie 60.0.2 i teraz działa. Może teraz zadziałaby w większości przeglądarek.
tsuma534

3
Jest rok 2020 i nadal nie ma rozwiązania dla Safari?
Ömer An

Odpowiedzi:


61

To, co możesz zrobić, to dodać tekst jako value, który uwzględnia podział wiersza \n.

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

Następnie możesz go zdjąć focusi nałożyć z powrotem (jeśli jest pusty) blur. Coś takiego

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

Przykład: http://jsfiddle.net/airandfingers/pdXRx/247/

Nie czysty CSS i nie czysty, ale załatwia sprawę.


4
z pewnością mógłbym sfałszować efekt zastępczy za pomocą javascript, ale
liczyłem

2
Niestety, @amosrivera, wydaje się, że nie ma standardowego sposobu: developer.mozilla.org/en/HTML/HTML5/… , poza obejściem skryptowym.
Jason Gennaro,

3
dobre rozwiązanie, ale dodałbym if($(this).val() == 'This is...')do focushandlera, w przeciwnym razie jeśli dodasz jakiś tekst, potem stracisz fokus, a następnie ponownie klikniesz na obszar tekstu, twój tekst zniknie.
Dennis Golomazov

2
@DenisGolomazov Dobry dodatek; Właśnie przesłałem edycję z czekiem w module obsługi fokusa. Polecam również dodanie klasy zastępczej i stylów symboli zastępczych w inny sposób, jak pokazano w tej aktualizacji na moim zmodyfikowanym przykładzie jsfiddle
Aaron

Co się stanie, jeśli użytkownik wprowadzi dane wejściowe, które dokładnie pasują do tekstu zastępczego, czy to również nie zostanie usunięte?
Arjuna

274

Możesz wstawić nową jednostkę html linii &#10;wewnątrz atrybutu symbolu zastępczego:

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

Działa na: Chrome 62, IE10, Firefox 60

Nie działa na: Safari 11

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


7
robi to dokładnie to, o co pytano w pierwotnym pytaniu. dlaczego nie jest wyżej głosowany? czy to nie działa w każdej przeglądarce?
DaveAlger,

9
@DaveAlger - Rzeczywiście tak nie jest. Właśnie wypróbowałem to w FF i wypisuje &#10;dosłownie, bez tworzenia białych znaków. Zobacz developer.mozilla.org/en/HTML/HTML5/…
Merlyn Morgan-Graham

1
Działa na IE10 i Chrome 62.
miny1997

1
Działa bardzo dobrze w nowszych wersjach przeglądarki Firefox
ii iml0sto1

10
Działa w przeglądarce Firefox 60.
Rob Porter

57

Nie myśl, że możesz to zrobić: http://www.w3.org/TR/html5/forms.html#the-placeholder-attribute

Odpowiednia treść (wyróżnienie moje):

Atrybut zastępczy reprezentuje krótką wskazówkę (słowo lub krótką frazę), która ma pomóc użytkownikowi we wprowadzaniu danych, gdy formant nie ma wartości. Wskazówka może być przykładową wartością lub krótkim opisem oczekiwanego formatu. Atrybut, jeśli został określony, musi mieć wartość niezawierającą znaków U + 000A LINE FEED (LF) ani U + 000D CARRIAGE RETURN (CR).


@amosrivera Hmm. Cóż, sprzedawcy mogą interpretować specyfikację w sposób, który uznają za odpowiedni.
Tieson T.

10
jestem narzędziem, wyglądało to na zerwanie linii, ale w rzeczywistości był to tylko symbol zastępczy zawijający się wokół szerokości
obszaru tekstu

3
@amosrivera LOL, przynajmniej możesz się z tego śmiać, prawda? Nic straconego, próbując ...:]
Tieson T.

1
Odpowiedź jest poprawna. ale uważam tę regułę za kompletną bzdurę. Jaki jest dokładny argument „nie może zawierać” LR lub CR?
Jens A. Koch

2
@ Jens-AndréKoch Zakładam, że argumentem jest to, że symbol zastępczy powinien być prosty; jeśli wartość jest na tyle złożona, że ​​wymaga znaków końca wiersza, powinna istnieć jako element równorzędny, podobnie jak w przypadku aktywacji łącza „pokaż pomoc” w tym edytorze komentarzy. Symbol zastępczy nie jest widoczny po wejście zawiera treści, mimo wszystko ...
Tieson T.

54

AKTUALIZACJA (styczeń 2016 r.): Miły mały hack może już nie działać we wszystkich przeglądarkach, więc mam nowe rozwiązanie z niewielkim fragmentem JavaScript poniżej.


Niezły mały hack

To nie jest przyjemne, ale możesz po prostu umieścić nowe wiersze w html. Lubię to:

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

Zwróć uwagę, że każda linia znajduje się w nowej linii (nie jest zawijana), a każde wcięcie tabulatora ma 4 spacje. To prawda, nie jest to zbyt fajna metoda, ale wydaje się, że działa:

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

  • Prawdopodobnie poziom wcięcia każdego wiersza będzie się różnił w zależności od szerokości obszaru tekstowego.
  • Ważne jest, aby mieć resize: none;w css, aby rozmiar obszaru tekstowego był stały (patrz jsfiddle).

Alternatywnie, jeśli chcesz nową linię, naciśnij dwukrotnie klawisz Return (więc między twoimi „nowymi liniami” jest pusta linia. Utworzona „pusta linia” musi mieć wystarczającą liczbę tabulatorów / spacji, które odpowiadałyby szerokości obszaru tekstowego. Nie Wydaje się, że nie ma to znaczenia, jeśli masz zbyt wiele, po prostu potrzebujesz wystarczająco dużo. Jest to jednak tak brudne i prawdopodobnie nie jest zgodne z przeglądarkami. Chciałbym, aby był łatwiejszy sposób!


Lepsze rozwiązanie

Sprawdź JSFiddle .

  • To rozwiązanie umieszcza element div za obszarem tekstowym.
  • Niektóre javascript są używane do zmiany koloru tła obszaru tekstu, odpowiedniego ukrycia lub ujawnienia symbolu zastępczego.
  • Dane wejściowe i symbole zastępcze muszą mieć te same rozmiary czcionek, stąd te dwie mieszanki.
  • Właściwości box-sizingi display: blockw obszarze tekstowym są ważne lub znajdujący się za nimi element div nie będzie tego samego rozmiaru.
  • Ważne są również ustawienia resize: verticali a min-heightna obszarze tekstu - zwróć uwagę, jak tekst zastępczy zostanie zawinięty, a rozszerzenie obszaru tekstu zachowa białe tło. Jednak komentowanie resizewłaściwości spowoduje problemy podczas poziomego rozszerzania obszaru tekstu.
  • Po prostu upewnij się, że minimalna wysokość obszaru tekstowego jest wystarczająca, aby zakryć cały symbol zastępczy przy jego najmniejszej szerokości. **

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

Bardzo ładny hack. To zdecydowanie działa w Chrome. Czy możemy potwierdzić, że działa tak samo we wszystkich innych głównych przeglądarkach?
Mark Amery

2
Chciałbym, żeby ktoś przetestował to w IE. Mogę potwierdzić, że działa w najnowszych wersjach Safari i Chrome, ale na pewno nie Firefox. Teraz używam tekstu zamiast symbolu zastępczego i mam klasę css, aby tekst wyglądał jak symbol zastępczy. Następnie mała funkcja jQuery, która usuwa tekst, gdy ma fokus - lub przywraca go, jeśli jest pusty!
Patrick

2
Działa dobrze w Chrome i IE 11. Ale nie działa w domyślnej przeglądarce Firefox i Android.
Programator chemiczny,

1
Nie działa w Safari, Firefox, Opera. Działa tylko w Chrome :(
0

1
Powinna to być akceptowana odpowiedź, ponieważ obecna może podać wartość „placeholder” wraz z formularzem. Uwaga: rozwiązanie w sekcji „A Better Solution” działa poprawnie w różnych przeglądarkach. Komentarze mówiące inaczej muszą odnosić się do „A Nice Little Hack”.
Roy Prins,

15

Co powiesz na rozwiązanie 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
To najlepsze rozwiązanie spośród wszystkich wymienionych tutaj, IMO.
aendrew

To rozwiązanie nie działa w przeglądarce Firefox (testowane na 22.0-28.0b9).
Hartwig

@Hartwig Właściwie zauważyłem to samo. Z jakiegoś powodu Firefox nie obsługuje tego poprawnie. Właściwie to nie działa również w IE ==> niestety jest to tylko WebKit.
Samuli Hakoniemi

15

Salaamun Alekum

&#10;

Działa dla Google Chrome

wprowadź opis obrazu tutaj

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

Przetestowałem to na Windows 10.0 (kompilacja 10240) i Google Chrome w wersji 47.0.2526.80 m

08:43:08 AST 6 Rabi Al-Awwal, 1437 czwartek, 17 grudnia 2015 r

Dziękuję Ci


10

Dodaj tylko & # 10 do łamania linii, nie musisz pisać żadnych CSS ani 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

Stara odpowiedź:

Nie, nie możesz tego zrobić w atrybucie zastępczym. Nie możesz nawet kodować znaków HTML w nowych wierszach, jak &#13;&#10;w symbolu zastępczym.

Nowa odpowiedź:

Nowoczesne przeglądarki pozwalają to zrobić na kilka sposobów. Zobacz ten JSFiddle:

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


Pomocne skrzypce! Rozwiązanie 2 faktycznie działa w Safari.
sandinmyjoints


6

Spróbuj tego:

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

http://jsfiddle.net/vr79B/


Jest to po prostu wstawianie spacji po pierwszym zdaniu i nie można go używać w przypadku większej liczby kolumn ani elastycznej szerokości.
Jeffrey Neo


4

Nieco ulepszona wersja odpowiedzi Jasona Gennaro (patrz komentarze do kodu):

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

Podobała mi się praca Jasona Gennaro i Denisa Golomazova, ale chciałem czegoś, co byłoby bardziej przydatne na całym świecie. Zmodyfikowałem koncepcję tak, aby można ją było dodać do dowolnej strony bez żadnych konsekwencji.

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>

JavaScript jest bardzo prosty

<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

I zmodyfikowane skrzypce @Richard Bronosky za tak .

Lepszym podejściem jest użycie data-*atrybutu niż atrybutu niestandardowego. Wymieniłem <textarea placeholdernl>się <textarea data-placeholder>i niektóre inne style, jak również.

edytowane
Oto oryginalna odpowiedź Richarda, która zawiera pełny fragment kodu.


1
Lepiej, żeby za każdym razem, gdy dołączysz plik jsfiddle, wyjaśnij i wklej kod również tutaj, więc mamy go do dalszego użytku i nie musimy polegać na tym, że zawartość będzie w jsfiddle na zawsze.
avcajaraville

Masz rację, @avcajaraville. Ale nie załączyłem pełnego fragmentu kodu, ponieważ oryginalna odpowiedź Richarda dotyczy tego samego tematu, a moja to tylko prosta modyfikacja. Zamiast tego wskazałem jego odpowiedź.
Gongdo Gong

1

bardzo prosty

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

wartość reprezentuje oryginalny ciąg


1

Sprawdź to rozwiązanie z niestandardowym symbolem zastępczym.

  • Otrzymujesz wielowierszowy symbol zastępczy, który działa we wszystkich przeglądarkach (w tym Firefox)
  • Istnieje możliwość dostosowania symbolu zastępczego, jak chcesz

Demo na skrzypcach .

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

Nie lubię ukrywać symbolu zastępczego, gdy ustawiasz ostrość na obszarze tekstu. Stworzyłem więc funkcję konstruktora, Placeholderktóra wygląda dokładnie tak, jak wbudowany symbol zastępczy i działa również w innych przeglądarkach niż Google Chrome. Jest to bardzo wygodne, ponieważ możesz używać tej Placeholderfunkcji tak często, jak chcesz i nie potrzebuje ona nawet jQuery.

EDYTOWAĆ:

Teraz poprawnie obsługuje również przypadki specjalne, takie jak wstawianie symbolu zastępczego.

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>


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.