Bir metin alanının yer tutucu özelliğine satır sonu eklensin mi?


179

Birkaç yaklaşım denedim ama hiçbiri işe yaramadı. Herkes bunu aşmak için şık bir hile biliyor mu?

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

GÜNCELLEME: Kromda çalışmaz. Sadece metin alanı genişliğiydi.

Bkz. Http://jsfiddle.net/pdXRx/


2
PHP kullanıyorsanız, <?="\n"?>yeni bir satır olarak koyabilirsiniz
rybo111

39
Sadece &#10;yer tutucu özniteliğini ekleyin <textarea placeholder="This is a line&#10;This is another one"></textarea>. Cevap aşağıda.
lu1s

4
@ lu1s Chrome, IE'de çalışır, ancak Firefox ve Safari'de çalışmaz.
mb21

1
@ mb21 Firefox 60.0.2'de bir dakika önce test ettim ve şimdi çalışıyor. Belki şu anda çoğu tarayıcıda çalışır.
tsuma534

3
2020 ve Safari için hala bir çözüm yok mu?
Ömer An

Yanıtlar:


61

Yapabileceğiniz şey metni valuesatır sonuna saygılı olarak eklemektir \n.

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

Sonra onu kaldırabilir focusve tekrar (boşsa) uygulayabilirsiniz blur. Böyle bir şey

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

Örnek: http://jsfiddle.net/airandfingers/pdXRx/247/

Saf CSS değil ve temiz değil ama hile yapar.


4
kesinlikle javascript kullanarak yer tutucu etkisi sahte olabilir, ama daha basit bir şey umuyordum
amosrivera

2
Ne yazık ki, @ amosrivera, standart bir yol yok gibi görünüyor: scriptli bir geçici çözüm dışında developer.mozilla.org/en/HTML/HTML5/… .
Jason Gennaro

3
iyi bir çözüm ama eklersiniz if($(this).val() == 'This is...')için focus, sonra kaybetmek odak bazı metin eklemek aksi takdirde işleyici, sonra tekrar textarea tıklayın metin kaybolur.
Dennis Golomazov

2
@DenisGolomazov İyi ekleme; Odak işleyicisindeki çekle birlikte bir düzenleme gönderdim. Ayrıca, bu güncellemede değiştirilmiş jsfiddle örneğime göre bir yer tutucu sınıf eklemenizi ve yer tutucuları farklı şekillendirmenizi öneririm: jsfiddle.net/airandfingers/pdXRx/249
Aaron

Kullanıcı, yer tutucu metniyle tam olarak eşleşen bir giriş yaptıysa, bu da silinmez mi?
Arjuna

276

Yer &#10;tutucu özniteliğinin içine yeni bir satır html öğesi ekleyebilirsiniz :

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

Çalıştığı yerler: Chrome 62, IE10, Firefox 60

Çalışmıyor: Safari 11

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


7
bu tam olarak asıl sorunun istediğini yapar. neden daha yüksek oy kullanılmıyor? her tarayıcıda çalışmıyor mu?
DaveAlger

9
@DaveAlger - Gerçekten değil. Sadece FF'de denedim ve &#10;bir boşluk karakteri üretmeden kelimenin tam anlamıyla yazdırıyor . Bkz developer.mozilla.org/en/HTML/HTML5/...
Merlyn Morgan-Graham

1
IE10 ve Chrome 62 üzerinde çalışır.
miny1997 14:17

1
Firefox'un yeni sürümlerinde çok iyi çalışıyor
ii iml0sto1

10
Firefox 60'da çalışıyor.
Rob Porter

57

Bunu yapmanıza izin verildiğini düşünmeyin: http://www.w3.org/TR/html5/forms.html#the-placeholder-attribute

İlgili içerik (vurgu mayını):

Tutucu özelliği, bir temsil kısa ipucu kontrolü yok değerine sahip olduğunda, veri girişi ile kullanıcıya yardım etmek için tasarlanmıştır (bir kelime ya da kısa bir ifade). İpucu bir örnek değer veya beklenen biçimin kısa bir açıklaması olabilir. Belirtilen öznitelik, U + 000A LINE FEED (LF) veya U + 000D CARRIAGE RETURN (CR) karakteri içermeyen bir değere sahip olmalıdır.


@amosrivera Hmm. Satıcıların özellikleri uygun gördükleri şekilde yorumlamalarına izin verilir.
Tieson T.

10
im bir araç, bir çizgi kırılma gibi görünüyordu ama aslında sadece textarea genişliği etrafında sarma yer tutucusu oldu ..
amosrivera

3
@amosrivera LOL, en azından buna gülebilirsin, değil mi?
Denemekle

1
Cevap doğru. ama kuralın saçmalık olduğunu düşünüyorum. LR veya CR'yi "içermemelidir" için kesin argüman nedir?
Jens

2
@ Jens-AndréKoch Argümanın bir yer tutucunun basit olması gerektiğini varsayıyorum; değer satır sonlarına ihtiyaç duyacak kadar karmaşıksa, bu yorum düzenleyicisinin "yardımı göster" bağlantısını etkinleştirirseniz gördüğünüze benzer bir kardeş öğe olarak mevcut olmalıdır. Sonuçta, bir girdi içerik içerdiğinde yer tutucu görünmez ...
Tieson T.

54

GÜNCELLEME (Oca 2016): Güzel küçük kesmek artık tüm tarayıcılarda çalışmayabilir, bu yüzden aşağıda küçük bir javascript ile yeni bir çözümüm var.


Güzel Bir Küçük Hack

Hoş gelmiyor, ancak yeni satırları html'ye koyabilirsiniz. Bunun gibi:

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

Her satırın yeni bir satırda (kaydırılmamış) ve her 'sekme' girintisinin 4 boşluk olduğuna dikkat edin. Verilen çok güzel bir yöntem değil, ama işe yarıyor gibi görünüyor:

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

  • Her satırın girinti düzeyinin, metin alanınızın genişliğine bağlı olarak değişmesi muhtemeldir.
  • resize: none;Css'de bulunması önemlidir, böylece metin alanının boyutu sabittir (Bkz. Jsfiddle).

Alternatif olarak Yeni bir satır istediğinizde, iki kez geri dön düğmesine basın (Yani 'yeni satırlarınız' arasında boş bir satır var. Oluşturulan bu 'boş satırın', metin alanınızın genişliğine denk gelecek yeterli sekme / boşluk içermesi gerekir. Çok fazla şeyiniz varsa önemli değil, sadece yeterince ihtiyacınız var.Bu çok kirli ama muhtemelen tarayıcı uyumlu değil. Keşke daha kolay bir yol olsaydı!


Daha İyi Bir Çözüm

JSFiddle'a göz atın .

  • Bu çözüm, metin alanının arkasında bir div konumlandırır.
  • Bazı javascript, metin alanının arka plan rengini değiştirmek, yer tutucuyu uygun şekilde gizlemek veya göstermek için kullanılır.
  • Girişler ve yer tutucular aynı yazı tipi boyutlarına sahip olmalı, dolayısıyla iki karışım olmalıdır.
  • box-sizingVe display: blocktextarea üzerinde özellikleri önemlidir veya arkasında div aynı boyutta olmayacaktır.
  • Ayarlama resize: verticalve min-heightmetin alanı üzerindeki a da önemlidir - yer tutucu metnin nasıl sarılacağını ve metin alanını genişletmenin beyaz arka planı koruyacağını unutmayın. Ancak, resizeözelliği yorumlamak , metin alanını yatay olarak genişletirken sorunlara neden olur.
  • Sadece metin alanının minimum yüksekliğinin tüm yer tutucunuzu en küçük genişliğinde kapsayacak şekilde yeterli olduğundan emin olun. **

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

Çok şirin bir kesmek. Bu kesinlikle Chrome'da çalışıyor. Diğer tüm büyük tarayıcılarda aynı şekilde çalıştığını doğrulayabilir miyiz?
Mark Amery

2
IE'de test etmek için birini isterim. Safari ve Chrome'un en son sürümlerinde çalıştığını doğrulayabilirim, ancak kesinlikle Firefox'ta değil. Şimdi yer tutucu yerine metin kullanıyorum ve metni yer tutucu gibi göstermek için bir css sınıfına sahibim. Sonra odak olduğunda metni temizlemek için küçük bir jQuery işlevi - veya boşsa geri koyun!
Patrick

2
Chrome ve IE 11'de iyi çalışır. Ancak Firefox ve Android varsayılan tarayıcısında çalışmaz.
Kimyasal Programcı

1
Safari, Firefox, Opera'da çalışmıyor. Yalnızca Chrome'da çalışır :(
by0

1
Bu kabul edilen cevap olmalıdır, çünkü mevcut cevap form ile "yer tutucu" değerini gönderebilir. Not: "A Better Solution" altındaki çözüm tarayıcılar arasında düzgün çalışır. Farklı diyen yorumlar "Güzel Küçük Hack" e atıfta bulunmalıdır.
Roy Prins

15

Bir CSS çözümü hakkında: 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
Bu, burada listelenenlerin en iyi çözümü, IMO.
aendrew

Bu çözüm Firefox'ta çalışmaz (22.0-28.0b9'da test edilmiştir).
Hartwig

@Hartwig Aslında aynısını fark ettim. Bazı nedenlerden dolayı Firefox bunu doğru şekilde işlemez. Aslında IE üzerinde çalışmaz = => ne yazık ki sadece WebKit.
Samuli Hakoniemi

15

Salaamun Alekum

&#10;

Google Chrome için Çalışır

resim açıklamasını buraya girin

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

Bunu Windows 10.0 (Derleme 10240) Ve Google Chrome Sürüm 47.0.2526.80 m'de Test Ettim

08:43:08 AST 6 Rabi Al-Awwal, 1437 17 Aralık 2015 Perşembe

Teşekkür ederim


10

Kesme çizgisi için sadece & # 10 ekleyin, herhangi bir CSS veya javascript yazmanıza gerek yoktur.

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

Eski cevap:

Hayır, bunu yer tutucu özelliğinde yapamazsınız. &#13;&#10;Bir yer tutucusundaki gibi yeni satırları html bile kodlayamazsınız .

Yeni cevap:

Modern tarayıcılar bunu yapmanın çeşitli yollarını sunar. Bu JSFiddle'a bakın:

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


Yardımcı keman! Çözüm 2 aslında Safari'de çalışır.
sandinmyjoints


6

Bunu dene:

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

http://jsfiddle.net/vr79B/


Bu, 1. cümlenin ardından biraz boşluk bırakıyor ve daha fazla sütun veya esnek genişlikte kullanılamıyor.
Jeffrey Neo


4

Jason Gennaro'nun cevabının biraz geliştirilmiş bir versiyonu (kod yorumlarına bakın):

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

Jason Gennaro ve Denis Golomazov'un çalışmalarını beğendim, ancak küresel olarak daha yararlı olacak bir şey istedim. Ben herhangi bir sayfaya yansıma olmadan eklenebilmesi için konsepti değiştirdim.

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 çok basit

<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

@Richard Bronosky'nin kemanını böyle değiştirdim .

data-*Özel bir özellik yerine özellik kullanmak daha iyi bir yaklaşımdır . Ben yerini <textarea placeholdernl>etmek <textarea data-placeholder>ve diğer bazı stiller de.

edited
İşte Richard'ın tam kod snippet'ini içeren orijinal cevabı .


1
Bir jsfiddle eklediğinizde, kodu da buraya açıklayın ve yapıştırın, bu yüzden daha fazla referans için elimizde ve içeriğin sonsuza kadar jsfiddle'da olacağına güvenmemiz gerekmez.
avcajaraville

Haklısın, @avcajaraville. Ama Richard'ın orijinal cevabı aynı konuyla ilgili olduğundan ve benimki sadece basit bir değişiklik olduğundan tam kod snippet'ini dahil etmedim. Bunun yerine cevabını işaret ettim.
Gongdo Gong

1

Çok basit

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

değer orijinal dizeyi temsil eder


1

Özel yer tutucuyla bu çözümü inceleyin.

  • Tüm tarayıcılarda (Firefox dahil) çalışan çok satırlı yer tutucunuz olur
  • Yer tutucuyu istediğiniz gibi özelleştirmek mümkündür

Keman üzerinde demo .

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

Metin alanına odaklandığınızda yer tutucuyu gizlemeyi sevmiyorum. Bu yüzden, Placeholdertam olarak yerleşik yer tutucusuna benzeyen ve Google Chrome dışındaki diğer tarayıcılarda da çalışan bir yapıcı işlevi yaptım . Çok kullanışlı çünkü Placeholderfonksiyonu istediğiniz sıklıkta kullanabilirsiniz ve jQuery'ye bile ihtiyaç duymaz.

DÜZENLE:

Artık yer tutucuyu yerleştirme gibi özel durumları da doğru bir şekilde ele alıyor.

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>


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.