Así que esto es lo que tengo:
<path class="..." onmousemove="show_tooltip(event,'very long text
\\\n I would like to linebreak')" onmouseout="hide_tooltip()" d="..."/>
<rect class="tooltip_bg" id="tooltip_bg" ... />
<text class="tooltip" id="tooltip" ...>Tooltip</text>
<script>
<![CDATA[
function show_tooltip(e,text) {
var tt = document.getElementById('tooltip');
var bg = document.getElementById('tooltip_bg');
// set position ...
tt.textContent=text;
bg.setAttribute('width',tt.getBBox().width+10);
bg.setAttribute('height',tt.getBBox().height+6);
// set visibility ...
}
...
Ahora mi texto de información sobre herramientas muy largo no tiene un salto de línea, aunque si uso alert (); me muestra que el texto en realidad TIENE dos líneas. (Sin embargo, contiene un "\", ¿cómo lo elimino por cierto?)
No puedo hacer que CDATA funcione en ninguna parte.
javascript
svg
newline
line-breaks
sollniss
fuente
fuente
Respuestas:
Esto no es algo que sea compatible con SVG 1.1. SVG 1.2 tiene el
textArea
elemento, con ajuste automático de palabras, pero no está implementado en todos los navegadores. SVG 2 no planea implementarlotextArea
, pero sí tiene texto ajustado automáticamente .Sin embargo, dado que ya sabe dónde deben producirse los saltos de línea, puede dividir el texto en varios
<tspan>
s, cada uno conx="0"
ydy="1.4em"
para simular líneas de texto reales. Por ejemplo:Por supuesto, dado que desea hacer eso desde JavaScript, tendrá que crear e insertar manualmente cada elemento en el DOM.
fuente
<tspan>s
? ¿Reemplazar? ¿División?var tspan = document.createElement('tspan') tspan.setAttribute('x','0'); tspan.setAttribute('dy','1.2em'); tspan.textContent = text; tt.appendChild(tspan);
no muestra ningún texto.x=0
es una coordenada absoluta: mueve el fragmento de texto al origen del sistema de coordenadas actual . Eltransform
atributo delg
elemento define un nuevo sistema de coordenadas actual y, suponiendo que el texto está alineado a la izquierda, el tspan se mueve hacia la izquierda. Esto actúa como una instrucción de retorno de carro.dy=1.2em
es una coordenada relativa : mueve el fragmento de texto en esta cantidad, en relación con el fragmento de texto actual. Esto actúa como una instrucción de avance de línea. Combinado, obtienes un CR / LF.Supongo que ya lograste resolverlo, pero si alguien está buscando una solución similar, esto funcionó para mí:
Hay 3 líneas separadas por salto de línea.
fuente
Con la solución tspan, digamos que no sabe de antemano dónde colocar sus saltos de línea: puede usar esta función agradable, que encontré aquí: http://bl.ocks.org/mbostock/7555321
Eso automáticamente hace saltos de línea para svg de texto largo para un ancho dado en píxeles.
fuente
Creo que esto hace lo que quieres:
Divide el texto
\\\n
y para cada uno coloca cada fragmento en un tspan. Luego calcula el tamaño del cuadro requerido según la longitud más larga del texto y el número de líneas. También necesitará cambiar el elemento de texto de información sobre herramientas para que contenga tres tspans:Esto supone que nunca tiene más de tres líneas. Si desea más de tres líneas, puede agregar más tspans y aumentar la longitud del bucle for.
fuente
"\\\n"
lugar de"\n"
?He adaptado un poco la solución por @steco, el cambio de la dependencia de
d3
ajquery
y la adición de laheight
del elemento de texto como parámetrofuente
usa HTML en lugar de javascript
fuente