2013-03-20 16 views
8

Können Sie sich erklären, warum dies:HTML-Textbereich ignoriert den ersten Zeilenumbruch, warum?

<script type="text/javascript"> 
    document.write("<textarea cols='10' rows='10'>" + "\nhello\nbabe\n" + "</textarea>"); 
</script> 

am unteren Rande ein Textfeld mit einer neuen Linie machen, aber NO neue Linie am oberen?

enter image description here

Getestet IE8, FF11, Safari 5.1, Chrome 24

Und es ist kein JS Problem, auch wenn Sie HTML-Code in Seite schreiben Sie das gleiche Ergebnis zu erhalten, dh

<textarea cols='10' rows='10'> 
hello 
babe 
</textarea> 

Die erste neue Zeile fehlt noch !!!

Ich brauche wieder eine neue Linie oben zu geben, um zu zeigen:

document.write("<textarea cols='10' rows='10'>" + "\n\nhello\nbabe\n" + "</textarea>"); 
+0

haben Sie mit
Tag versuchen? –

+2

"\ n" wird nicht als Textarea-Wert behandelt, sondern als HTML-Bruchzeile – imclickingmaniac

Antwort

1

hinzufügen Leerzeichen vor dem ersten „\ n“ wie folgt aus:

<script type="text/javascript"> 
    document.write("<textarea cols='10' rows='10'>" + " \nhello\nbabe\n" + "</textarea>"); 
</script> 

oder

<textarea cols='10' rows='10'> <!-- whitespace here --> 
hello 
babe 
</textarea> 

andernfalls wird es nicht funktionieren.


Update: Später in der Server-Seite können Sie das erste Leerzeichen entfernen, indem

tun
$str = ltrim ($str,' '); 

oder

$str2 = substr($str, 4); 

wenn es PHP ist.

+0

Der Leerraum im Skript rendert die erste Zeile mit einem Leerzeichen. Das ist nicht gut, Daten im Textbereich könnten an den Server gesendet werden und sie würden in der Datenbank mit dem zusätzlichen Platz gespeichert, den niemand benötigt. –

+0

Ich habe die Antwort bearbeitet – bogatyrjov

3

Wenn Sie innerhalb von XHTML schreiben, verwenden Sie geeignete Entities.

Wenn ein Textknoten mit Leerzeichen (Leerzeichen, neue Zeile) beginnt, wird er von HTML-Parsern ignoriert. Das Codieren der neuen Zeile in eine richtige HTML-Entität zwingt den Parser, dies zu bestätigen.

&#13; == carriage return 
+0

Es funktioniert nicht auf IE8, funktioniert aber auf Chrome 24, Safari und FF. Ich nehme an, es ist IE8 Bug. –

+0

@Marco Demaio - IE8 kann auch einen Zeilenvorschub (& # 10) erfordern, da Windows glaubt, dass eine neue Zeile "\ n" ein Wagenrücklauf + Zeilenvorschub (& # 13 & # 10) ist. –

+0

Sie haben meinen Tag gemacht. Textarea hat eine Stunde getötet) –

3

Wenn möglich, Ihren Code ändert den Textbereich vordefiniert als html zu haben, dann wie diese Stelle die Zeichenfolge schreiben:

HTML:

<textarea cols='10' rows='10' id='test'></textarea> 

Script:

document.getElementById('test').innerHTML = '\nhello\nbabe\n'; 

Das sollte Leerraum erhalten.Optional können Sie eine CSS-Regel hinzufügen:

textarea { 
    white-space:pre; 
    } 

Eine Geige spielen:
http://jsfiddle.net/RFLwH/1/

Update:

OP in IE8 getestet, die dies nicht funktioniert - es erscheint eine Einschränkung zu sein/Bug mit diesem Browser. IE8 verwendet tatsächlich CR + LF, wenn Sie oben manuell einen Zeilenvorschub einfügen, aber wenn dies programmgesteuert eingestellt ist, wird dies vom Browser vollständig ignoriert.

Fügen Sie diese auf den HTML-Code, einen Test zu tun:

<span onclick="this.innerHTML = escape(document.getElementById('test').innerHTML);"> 
    Get textarea content 
</span> 

Sie die Zeichenfolge zurückgegeben sehen kann, ist:

%0D%0Ahello%20babe%20 

die CR + LF Bedeutung ist es (die anderen Line-Feeds sind in Leerzeichen konvertiert - aber das Einfügen eines Leerzeichens am Anfang hilft auch nicht. Ich denke, du kannst nichts gegen dieses Verhalten tun; der Browser ist veraltet (aber leider immer noch weit verbreitet, so dass dies ein Problem für diese Benutzer sein kann, wenn dies notwendig ist).

+0

Es funktioniert nicht auf IE8, funktioniert aber auf Chrome 24, Safari und FF. Ich nehme an, es ist IE8 Bug. –

+0

Ja, keine Überraschung dort. Ich habe einen Test für ie8 (lokal als Geige kann nicht auch in ie8 gezeigt) und manuell einen Zeilenvorschub oben eingefügt und nahm den Text aus und entkam es um zu sehen, was es enthielt. Es * fügt * dort bei/r/n ein, aber wenn es aus Javascript gesetzt wird, ignoriert es es einfach vollständig. Ich denke, es gibt nicht viel damit zu tun: -/ – K3N

0

Schließlich beenden ich mit dieser serverseitige Lösung:

(nur erster!) Zu verdoppeln führenden nl Symbol, bevor es in TextArea- Ausgabe:

if(str_startswith("\r\n",$value)) 
{ 
    $value = "\r\n".$value;    
}elseif(str_startswith("\n",$value)) 
{ 
    $value = "\n".$value; 
}elseif(str_startswith("\r",$value)) 
{ 
    $value = "\r".$value; 
} 

function str_startswith($start, $string) 
{ 
    if(mb_strlen($start)>mb_strlen($string)) 
    return FALSE; 
    return (mb_substr($string, 0,mb_strlen($start))==$start); 
} 
1

Es soll ein \n\r an der Spitze sein: document.write("<textarea cols='10' rows='10'>" + "\n\rhello\nbabe\n" + "</textarea>");

jsbin

+0

Wie seltsam, aber '' \ n \ r'' funktioniert für mich statt ''\ r \ n''! –

Verwandte Themen