Ich habe eine kleine Funktion gefunden, die einen String aus einer textarea
entnimmt, ihn dann in ein canvas
-Element einfügt und den Text umschließt, wenn die Zeile zu lang wird. Es werden jedoch keine Zeilenumbrüche erkannt. Dies ist, was es tut und was es tun sollte:
Eingang:
Hello
This is dummy text that could be inside the text area.
It will then get put into the canvas.
Falsche Ausgabe:
Hello this is dummy text
that could be inside the
text area. It will then
get put into the canvas.
Was soll es ausgeben:
Hello
This is dummy text that
could be inside the text
area. It will then get
put into the canvas.
Diese Funktion verwende ich:
function wrapText(context, text, x, y, maxWidth, lineHeight) {
var words = text.split(' ');
var line = '';
for(var n = 0; n < words.length; n++) {
var testLine = line + words[n] + ' ';
var metrics = context.measureText(testLine);
var testWidth = metrics.width;
if (testWidth > maxWidth && n > 0) {
context.fillText(line, x, y);
line = words[n] + ' ';
y += lineHeight;
}
else {
line = testLine;
}
}
context.fillText(line, x, y);
}
Kann ich erreichen, was ich erreichen möchte? Oder gibt es eine Möglichkeit, den Textbereich einfach auf die Leinwand zu verschieben?
Verwenden Sie folgendes:
var enteredText = document.getElementById("textArea").value;
var numberOfLineBreaks = (enteredText.match(/\n/g)||[]).length;
alert('Number of breaks: ' + numberOfLineBreaks);
Nun habe ich die Zeichenfolge first mit Zeilenumbrüchen geteilt und sie dann wie zuvor wieder geteilt. Hinweis: Sie können auch jQuery in Kombination mit Regex verwenden:
var splitted = $('#textArea').val().split("\n"); // will split on line breaks
Hoffe das hilft dir raus!
(Anmerkung: Diese Frage wurde bereits einmal hier ) gestellt.
Falls Sie eine Zeichenfolge von Ihrem JSON trennen müssen, wird das Sonderzeichen\n durch \\ n ersetzt.
Zeichenfolge nach Zeilenumbruch teilen:
Result.split('\n');
Geteilter String, der in JSON empfangen wurde, wobei das Sonderzeichen \ n bei JSON.stringify (in Javascript) oder json.json_encode (in PHP) durch \\ n ersetzt wurde. Wenn Sie also Ihren String in einer Antwort AJAX haben, wurde er für den Transport verarbeitet. Wenn es nicht dekodiert wird, wird\n\n\n durch \\ n ** ersetzt, und Sie müssen Folgendes verwenden:
Result.split('\\n');
Beachten Sie, dass die Debugger-Tools Ihres Browsers diesen Aspekt möglicherweise nicht wie erwartet anzeigen. Sie können jedoch feststellen, dass die Aufteilung durch \\ n zu zwei Einträgen führte, die ich in meinem Fall benötige:
So habe ich Text auf eine Leinwand gedruckt. Die Eingabe kommt nicht von einer textarea
, sondern von input
, und ich teile nur das Leerzeichen. Definitiv nicht perfekt, funktioniert aber für meinen Fall. Es gibt die Zeilen in einem Array zurück:
splitTextToLines: function (text) {
var idealSplit = 7,
maxSplit = 20,
lineCounter = 0,
lineIndex = 0,
lines = [""],
ch, i;
for (i = 0; i < text.length; i++) {
ch = text[i];
if ((lineCounter >= idealSplit && ch === " ") || lineCounter >= maxSplit) {
ch = "";
lineCounter = -1;
lineIndex++;
lines.Push("");
}
lines[lineIndex] += ch;
lineCounter++;
}
return lines;
}
Hier ist der endgültige Code, den ich [OP] verwendet habe. Wahrscheinlich keine Best Practice, aber es hat funktioniert.
function wrapText(context, text, x, y, maxWidth, lineHeight) {
var breaks = text.split('\n');
var newLines = "";
for(var i = 0; i < breaks.length; i ++){
newLines = newLines + breaks[i] + ' breakLine ';
}
var words = newLines.split(' ');
var line = '';
console.log(words);
for(var n = 0; n < words.length; n++) {
if(words[n] != 'breakLine'){
var testLine = line + words[n] + ' ';
var metrics = context.measureText(testLine);
var testWidth = metrics.width;
if (testWidth > maxWidth && n > 0) {
context.fillText(line, x, y);
line = words[n] + ' ';
y += lineHeight;
}
else {
line = testLine;
}
}else{
context.fillText(line, x, y);
line = '';
y += lineHeight;
}
}
context.fillText(line, x, y);
}
Zeichenfolge in JavaScript aufteilen
var array = str.match(/[^\r\n]+/g);
OR
var array = str.split(/\r?\n/);
Sie sollten versuchen, die erste Zeile zu erkennen.
Dann ist die:
if(n == 0){
line = words[n]+"\n";
}
Ich bin mir nicht sicher, aber vielleicht hilft es.