คุณสามารถมีข้อความตัวยึด HTML5 หลายบรรทัดใน <textarea> ได้หรือไม่


153

ฉันมีข้อความผีในฟิลด์ข้อความที่หายไปเมื่อคุณมุ่งเน้นไปที่พวกเขาโดยใช้คุณลักษณะตัวยึดตำแหน่งของ HTML5:

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

ฉันต้องการใช้กลไกเดียวกันนี้เพื่อมีข้อความตัวยึดหลายบรรทัดใน textarea บางทีอาจเป็นอย่างนี้:

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

แต่สิ่งเหล่านั้น\nปรากฏในข้อความและไม่ก่อให้เกิดการขึ้นบรรทัดใหม่ ... มีวิธีที่จะมีตัวยึดหลายบรรทัดหรือไม่?

อัปเดต : วิธีเดียวที่ฉันได้รับการทำงานนี้คือการใช้ปลั๊กอิน jQuery Watermarkซึ่งยอมรับ HTML ในข้อความตัวยึดตำแหน่ง:

$('.textarea_class').watermark('Enter story<br/> * newline', {fallback: false});

IE ดูเหมือนว่าจะจัดการอย่างถูกต้อง Firefox OTOH ไม่สนใจบรรทัดใหม่
ekkis

1
stackoverflow.com/questions/7312623/…เป็นคำถามที่คล้ายกันมากและมีคำตอบที่ดีเช่นกัน
Lloyd Dewolf

หากคุณกำลังเผชิญกับสิ่งนี้และการใช้ js เพื่อตั้งค่าตรวจสอบ css white-spaceเพื่อให้แน่ใจว่ามันถูกตั้งค่าอย่างถูกต้องเช่น pre-wrap
Cory Mawhorter

จากคำถามอื่น: &#10;ทำงานได้ทุกที่ยกเว้น Safari
Sphinxxx

คำตอบ:


82

สำหรับ<textarea>s ข้อมูลจำเพาะเฉพาะสรุปว่าการแบ่งผลตอบแทนการขนส่ง + สายในแอตทริบิวต์ตัวยึดจะต้องกลายเป็นบรรทัดใหม่โดยเบราว์เซอร์

ตัวแทนผู้ใช้ควรนำเสนอคำแนะนำนี้ให้กับผู้ใช้เมื่อค่าขององค์ประกอบเป็นสตริงว่างเปล่าและไม่ได้รับการควบคุม (เช่นโดยแสดงไว้ในการควบคุมว่างเปล่าที่ไม่มีการโฟกัส) ผลตอบแทนของ U + 000D CARRIAGE U + 000A LINE FEED ตัวละครคู่ (CRLF) ในคำใบ้เช่นเดียวกับ U + 000D ผลตอบแทน CARRIAGE (CR) และ U + 000A LINE FEED (LF) ตัวอื่น ๆ ในคำใบ้นั้นจะต้องได้รับการปฏิบัติ เป็นตัวแบ่งบรรทัดเมื่อแสดงคำใบ้

ยังสะท้อนให้เห็นใน MDN: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/textarea#attr-placeholder

FWIW เมื่อฉันลองใช้ Chrome 63.0.3239.132 มันใช้งานได้ตามที่ควรจะเป็น


37
ยกเว้นว่าคุณลักษณะชื่อเรื่องจะไม่ทำงานในลักษณะเดียวกันนั่นคือมันจะไม่แสดงเนื้อหาผี ในความเป็นจริงมันจะเหมาะอย่างยิ่งสำหรับตัวยึดเพื่อรองรับหลายบรรทัดสำหรับพื้นที่ข้อความเนื่องจากพื้นที่ข้อความเป็นสิ่งมีชีวิตหลายบรรทัด สงสารสเป็คไม่อนุญาต ฉันเดาว่าแฮ็คจะต้องทำ ถอนหายใจ
ekkis

71

เมื่อวันที่มากที่สุด (ดูรายละเอียดด้านล่าง) เบราว์เซอร์, การแก้ไขตัวยึดใน JavaScript ช่วยให้ยึดหลาย ตามที่ได้มีการกล่าวไปแล้วมันไม่เป็นไปตามข้อกำหนดและคุณไม่ควรคาดหวังให้มันทำงานได้ในอนาคต (แก้ไข: ใช้งานได้)

ตัวอย่างเช่นนี้แทนที่ทุกตัวยึดหลาย textarea ของ

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>

JsFiddleตัวอย่าง

ผลลัพธ์ที่คาดหวัง

ผลลัพธ์ที่คาดหวัง


ดูเหมือนว่าเบราว์เซอร์บางคนยอมรับการแฮ็กนี้และคนอื่นไม่เห็นด้วย
นี่คือผลลัพธ์ของการทดสอบที่ฉันรัน (ด้วยเบราว์เซอร์ภาพและเบราส์สแต็ค )

  • Chrome:> = 35.0.1916.69
  • Firefox:> = 35.0 (ผลลัพธ์ขึ้นอยู่กับแพลตฟอร์ม)
  • IE:> = 10
  • เบราว์เซอร์ที่ใช้ KHTML: 4.8
  • Safari: ไม่ (ทดสอบ = Safari 8.0.6 Mac OS X 10.8)
  • Opera: ไม่ (ทดสอบ <= 15.0.1147.72)

ผสมกับวิทยานิพนธ์สถิติ , ที่นี้หมายถึงว่าการทำงานที่เกี่ยวกับ88.7%ของปัจจุบัน(ตุลาคม 2015)เบราว์เซอร์ที่ใช้

อัปเดต : วันนี้ใช้งานได้กับเบราว์เซอร์ที่ใช้งานอย่างน้อย94.4%ของปัจจุบัน(กรกฎาคม 2018)


1
ตัวอย่าง jsfiddle นั้นใช้งานไม่ได้เลย ... มันเป็นแบบหลายบรรทัดเท่านั้นเพราะขนาดของ textarea
sebnukem

2
มีการพิมพ์ผิด แต่ฉันไม่สามารถแก้ไขได้เพราะ StackOverflow ให้ข้อผิดพลาด "การแก้ไขต้องมีอย่างน้อย 6 ตัวอักษร" ให้ฉัน ชั้นเรียนของคุณควรจะเป็นmultilineไม่ได้multiligne
แดเนียล Loureiro

@sebnukem: ใช้งานได้กับเบราว์เซอร์ส่วนใหญ่ที่ฉันได้ทำการทดสอบ และมันไม่ใช่เรื่องของขนาดของ textarea คุณสามารถให้ข้อมูลเพิ่มเติมเกี่ยวกับปัญหาที่คุณมีได้หรือไม่?
Cyrbil

ดูเหมือนว่าจะใช้งานไม่ได้กับซาฟารี ... - \ n หายไป แต่ทุกอย่างอยู่ในบรรทัดเดียว
Hackeron

1
@Jroonk: ฉันสามารถยืนยันได้ ไม่ใช่เพราะโครเมียม แต่บังคับให้ Apple บังคับให้เบราว์เซอร์ใช้ IOS ของWKWebViewตน จากนั้นเบราว์เซอร์ใด ๆ บน IOS จะไม่ทำการแฮ็คนี้อย่างถูกต้องจนกว่าWKWebViewจะเสร็จ
Cyrbil

59

ฉันพบว่าถ้าคุณใช้พื้นที่มากเบราว์เซอร์จะทำการพันคำอย่างถูกต้อง ไม่ต้องกังวลเกี่ยวกับการใช้ช่องว่างจำนวนที่แน่นอนเพียงแค่โยนจำนวนมากลงไปในนั้นและเบราว์เซอร์ควรจะตัดเป็นอักขระช่องว่างตัวแรกในบรรทัดถัดไป

<textarea name="address" placeholder="1313 Mockingbird Ln         Saginaw, MI 45100"></textarea>

2
ตัวยึดหลายตำแหน่งของ Yep ไม่รองรับ crossbrowser พบว่าซาฟารีรุ่นล่าสุดรองรับ แต่ไม่รองรับ iOS5 แน่นอน
Tom

7
ที่ไม่ได้ผลสำหรับฉันใน IE หรือ Firefox Windows มันแค่แทรกช่องว่างที่ฉันขอให้ไป
ekkis

Chrome 37 แสดงข้อความตัวยึดตำแหน่งใน textarea โดยไม่ต้องตัดบรรทัดใหม่ ไม่มีใครรู้ว่าชื่อของ 'คุณสมบัติ' คือเพื่อให้ฉันสามารถ) มองหาและข) ทดสอบมันได้หรือไม่
Ben

23

มีแฮ็คจริงซึ่งทำให้สามารถเพิ่มตัวยึดหลายบรรทัดในเบราว์เซอร์ Webkit, Chrome ใช้งานได้ แต่ในเวอร์ชันล่าสุดที่พวกเขาลบมัน:


ก่อนอื่นให้เพิ่มบรรทัดแรกของตัวยึดตำแหน่งของคุณลงใน html5 ตามปกติ

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

จากนั้นเพิ่มส่วนที่เหลือของบรรทัดโดย css:

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

หากคุณต้องการให้สายของคุณที่เดียวคุณสามารถลองต่อไปนี้ ข้อเสียของสิ่งนี้คือเบราว์เซอร์อื่นที่ไม่ใช่ Chrome, Safari, webkit-etc ไม่ต้องแสดงบรรทัดแรก:

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

จากนั้นเพิ่มส่วนที่เหลือของบรรทัดโดย css:

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

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

ซอ Fiddle

มันจะดีมากถ้าเป็นเช่นนั้นจะได้รับการสาธิตที่คล้ายกันทำงานบน Firefox


ขอบคุณที่ให้ลิงค์ซอ มันทำให้ง่ายต่อการตรวจสอบพฤติกรรมในเบราว์เซอร์ต่างๆ บน IE 10 ทั้งสองรุ่นล้มเหลวเช่นเดียวกับใน FF 12 (Windows) น่าเสียดายที่ Safari 6.1 ทำงาน :(
ekkis

ไม่สามารถใช้งานกับ Chrome ได้อีกต่อไปเป็นเวลานานแล้วฉันจะสมมุติ
Mike Rockétt

6

หากคุณใช้ AngularJS คุณสามารถใช้เครื่องมือจัดฟันเพื่อวางสิ่งที่คุณต้องการ: นี่คือซอ

<textarea rows="6" cols="45" placeholder="{{'Address Line1\nAddress Line2\nCity State, Zip\nCountry'}}"></textarea>

1
ฉันกำลังใช้วิธีการที่คล้ายกัน แต่มันก็ไม่ได้ทำงานใน Safari และ Firefox
สแตน

6

ตาม MDN ,

การขึ้นบรรทัดใหม่หรือการป้อนบรรทัดภายในข้อความตัวยึดต้องถือว่าเป็นตัวแบ่งบรรทัดเมื่อแสดงคำใบ้

ซึ่งหมายความว่าหากคุณเพิ่งข้ามไปยังบรรทัดใหม่มันควรจะแสดงผลอย่างถูกต้อง กล่าวคือ

<textarea placeholder="The car horn plays La Cucaracha.
You can choose your own color as long as it's black.
The GPS has the voice of Darth Vader.
"></textarea> 

ควรแสดงผลเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่


3

ข้อมูลจำเพาะ HTML5ชัดปฏิเสธสายใหม่ในฟิลด์เจ้าของสถานที่ รุ่นของ Webkit / จะ /แทรกบรรทัดใหม่เมื่อแสดงด้วยตัวดึงข้อมูลบรรทัดในตัวยึดตำแหน่งอย่างไรก็ตามนี่เป็นลักษณะการทำงานที่ไม่ถูกต้องและไม่ควรเชื่อถือ

ฉันเดาว่าย่อหน้าไม่สั้นพอสำหรับ w3;)


1
พฤติกรรมของ Webkit ไม่ถูกต้องเนื่องจากข้อกำหนดไม่ได้บอกว่าจะต้องเกิดอะไรขึ้นถ้ามี CR / LF อยู่
Christian

1
@Christian มันทำแล้วตอนนี้มันบอกว่า "ตัวแทนผู้ใช้ควรนำเสนอคำแนะนำนี้ให้กับผู้ใช้หลังจากที่มีการแบ่งบรรทัดออกจากมัน ... " มันบอกว่าเรื่องนี้เกี่ยวกับการแยกตัวแบ่งบรรทัด: "เมื่อตัวแทนผู้ใช้คือการแยกตัวแบ่งบรรทัดจากสตริงตัวแทนผู้ใช้ต้องลบอักขระ" LF "(U + 000A) และ" CR "(U + 000D) อักขระใด ๆ จากสตริงนั้น "
Richard Turner

คำตอบนี้ไม่เป็นความจริงอีกต่อไป สเป็คตอนนี้อย่างชัดแจ้งว่าต้องแบ่งบรรทัดในตัวยึดจะกลายเป็นบรรทัดใหม่
Clonkex

3

ตอบสนอง:

หากคุณกำลังใช้ React คุณสามารถทำได้ดังนี้:

placeholder={'Address Line1\nAddress Line2\nCity State, Zip\nCountry'}

2

หากคุณtextareaมีความกว้างคงที่คุณสามารถใช้การรวมกันของพื้นที่ไม่แตกและการตัดข้อความอัตโนมัติ เพียงแค่แทนที่ช่องว่างเป็นทุกบรรทัดและตรวจสอบให้แน่ใจว่าเส้นเพื่อนบ้านสองเส้นไม่สามารถรวมเป็นหนึ่งบรรทัดได้ line length > cols/2ในทางปฏิบัติ

นี่ไม่ใช่วิธีที่ดีที่สุด แต่อาจเป็นโซลูชันข้ามเบราว์เซอร์เดียว

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


1

คุณสามารถลองใช้ CSS มันได้ผลกับฉัน ต้องระบุแอตทริบิวต์placeholder=" "ที่นี่

<textarea id="myID" placeholder=" "></textarea>
<style>
#myID::-webkit-input-placeholder::before {
    content: "1st line...\A2nd line...\A3rd line...";
}
</style>

1

ใน php พร้อมกับฟังก์ชั่น 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

ฉันไม่คิดว่าเป็นไปได้ด้วย html / css เพียงอย่างเดียว อาจเป็นไปได้โดยใช้ JavaScript หรือแฮ็คชนิดอื่น - มีช่องว่างเพิ่มเติมเพื่อดันข้อความไปยังบรรทัดถัดไป ฯลฯ


0

Bootstrap + contenteditable + ตัวยึดหลายบรรทัด

การสาธิต: https://jsfiddle.net/39mptojs/4/

ตาม @cyrbil และ @daniel คำตอบ

ใช้ Bootstrap, jQuery และhttps://github.com/gr2m/bootstrap-expandable-inputเพื่อเปิดใช้งานตัวยึดตำแหน่งใน contenteditable

การใช้ "ตัวยึดแทนที่" จาวาสคริปต์และเพิ่ม "white-space: pre" ใน css จะแสดงตัวยึดหลายบรรทัด

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

-1

วิธีการแก้ปัญหาลายน้ำในโพสต์ต้นฉบับใช้งานได้ดี ขอบคุณสำหรับมัน ในกรณีที่ทุกคนต้องการมันนี่เป็นคำสั่งเชิงมุมสำหรับมัน

(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'));
              }
            }
          }
        }
      };
    });
}());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.