2012-06-27 12 views
5

Al agregar texto largo dentro de un elemento HTML, como un DIV, el elemento ajusta ese texto. Exactamente como este texto de la Pregunta, en realidad. ¿Cómo puedo tomar el texto de un elemento HTML así y determinar dónde se rompe? es decir, donde se inserta una nueva línea.¿Cómo puedo determinar las posiciones de "nuevas líneas" en el texto de un elemento HTML?

Por ejemplo, en este cuadro, hay una nueva línea después de "... como este", una después de "... donde" y dos después de "... se inserta".

+0

[. Esto podría ser de alguna ayuda] (http://stackoverflow.com/questions/320184/how- to-prevent-long-words-from-breaking-my-div) – xan

+0

O http://stackoverflow.com/questions/4719777/finding-line-breaks-in-textarea-that-is-word-wrapping-arabic- texto – Theo

+0

¿Qué estás tratando de lograr al final? – katspaugh

Respuesta

2

Por lo tanto, el problema es en realidad cómo hacer palabra y embalaje en HTML5 lienzo:

Todo esto es para la conversión de algunos elementos HTML estándar que sujetan el texto y/o una foto en un lienzo HTML5. Y desafortunadamente, el método '.fillText()' no es lo suficientemente inteligente como para romper una pieza de texto para , por lo que necesito "detectar" manualmente cada línea.

Lo que usted puede hacer es measureText posteriormente agregar una palabra a la vez. Mida la primera palabra, y si se ajusta al ancho de su contenedor (ctx2d.measureText(words).width <= containerWidth), puede agregar otra palabra y medir nuevamente. Hasta que la cadena de palabras no encaje. Si no es así, debe marcar fillText en la línea siguiente.

En cuanto a los saltos de línea insertados manualmente, se representan específicamente en HTML, ya sea por \n o \r caracteres en textareas o por elementos HTML, como <br \>. Por lo tanto, antes de medir el texto, es posible que desee dividirlo por párrafos.

En áreas de texto:

var paragraphs = textarea.value.split('\n'); 

En elementos no forma:

var paragraphs = []; 

// getting all <p> and elements in a typical HTML element 
// as well as individual text nodes (they are just DOM-nodes), 
// separated by <br /> elements 
var innerNodes = nonFormElement.childNodes; 

for (var i = 0, len = innerNodes.length; i += 1) { 
    // if a sub-element has some text in it, 
    // add the text to our list 
    var content = innerNodes[i].textContent; 
    if (content) { 
     paragraphs.push(content); 
    } 
} 
+0

Creo que esta es la solución más cercana a lo que estoy tratando de lograr. Básicamente, para tomar el texto completo y comenzar a agregar un carácter a la vez a una cadena 'buffer' y después de cada inserción, mida la longitud (en píxeles) de ese buffer. Sin embargo, esto no resuelve el problema de los saltos de línea reales. Es decir, podría dejar algunas líneas en blanco. ¿Cómo podría detectar estas líneas? –

+0

@AndreiOniga, ver la respuesta actualizada. – katspaugh

+0

Para ser completamente honesto, no entiendo el enfoque de los elementos que no son de forma. Sin embargo, estoy usando un área de texto para anexarle el contenido, luego uso el método .split() para detectar los caracteres de nueva línea, y en conjunto con el método measureText(), creo que podré alcanzar mi objetivo . ¡Gracias! –

1

No estoy seguro de lo que está tratando de lograr. Pero aquí hay un truco simple que puede usar para identificar las posiciones de palabras sueltas. Ver este fiddle


var $text = $('#text'), 
    breaks = [], 
    top; 

// wrap words (\w+) and punctuation (\S+) [well, non-word and non-space] 
// in <spans> we can easily identify 
$text.html($text.text().replace(/(\w+|\S+)/g, '<span>$1</span>')); 

$text.children().each(function() { 
    var $this = $(this), 
     _top = $this.position().top; 

    if (top === undefined) { 
     top = _top; 
    } else if (top < _top) { 
     top = _top; 
     // moved a row down 
     breaks.push($this.prev()); 
     $this.prev().css('color', 'red'); 
    } 
}); 


console.log(breaks); 
+0

Rod, le agradezco su ayuda en esto. Sin embargo, como ya comenté la respuesta de katspaugh, no veo cómo esto puede resolver el problema de los saltos de línea. Porque puedo (o no) presionar 'Volver' varias veces e insertar una o más líneas en blanco. Y no podría detectar esas líneas y dibujarlas tal como están, en el lienzo. ¿Alguna idea en como solucionar este problema? –

Cuestiones relacionadas