Alors voici ce que j'ai:
<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 ...
}
...
Maintenant, mon très long texte d'info-bulle n'a pas de saut de ligne, même si j'utilise alert (); cela me montre que le texte a en fait deux lignes. (Il contient un "\" cependant, comment puis-je supprimer celui-là?)
Je ne peux pas faire fonctionner CDATA n'importe où.
javascript
svg
newline
line-breaks
sollniss
la source
la source
Réponses:
Ce n'est pas quelque chose que SVG 1.1 prend en charge. SVG 1.2 a l'
textArea
élément, avec un retour à la ligne automatique, mais il n'est pas implémenté dans tous les navigateurs. SVG 2 ne prévoit pas de mise en œuvretextArea
, mais il contient du texte enveloppé automatiquement .Cependant, étant donné que vous savez déjà où vos sauts de ligne doivent se produire, vous pouvez diviser votre texte en plusieurs
<tspan>
s, chacun avecx="0"
etdy="1.4em"
pour simuler des lignes de texte réelles. Par exemple:Bien sûr, puisque vous voulez faire cela à partir de JavaScript, vous devrez créer et insérer manuellement chaque élément dans le DOM.
la source
<tspan>s
? Remplacer? Divisé?var tspan = document.createElement('tspan') tspan.setAttribute('x','0'); tspan.setAttribute('dy','1.2em'); tspan.textContent = text; tt.appendChild(tspan);
ne montre aucun texte.x=0
est une coordonnée absolue: déplace le fragment de texte à l'origine du système de coordonnées courant . L'transform
attribut sur l'g
élément définit un nouveau système de coordonnées courant, et en supposant que le texte est aligné à gauche, le tspan est déplacé vers la gauche. Cela agit comme une instruction de retour chariot.dy=1.2em
est une coordonnée relative : déplacez le fragment de texte de cette valeur par rapport au fragment de texte actuel. Cela agit comme une instruction de saut de ligne. Combiné, vous obtenez un CR / LF.Je suppose que vous avez déjà réussi à le résoudre, mais si quelqu'un cherche une solution similaire, cela a fonctionné pour moi:
Il y a 3 lignes séparées par un saut de ligne.
la source
Avec la solution tspan, disons que vous ne savez pas à l'avance où mettre vos sauts de ligne: vous pouvez utiliser cette fonction sympa, que j'ai trouvée ici: http://bl.ocks.org/mbostock/7555321
Cela fait automatiquement des sauts de ligne pour le texte long svg pour une largeur donnée en pixel.
la source
Je pense que cela fait ce que vous voulez:
Il divise le texte sur
\\\n
et pour chacun met chaque fragment dans un tspan. Ensuite, il calcule la taille de la boîte requise en fonction de la plus grande longueur de texte et du nombre de lignes. Vous devrez également modifier l'élément de texte de l'infobulle pour qu'il contienne trois tspans:Cela suppose que vous n'ayez jamais plus de trois lignes. Si vous voulez plus de trois lignes, vous pouvez ajouter plus de cuillères à café et augmenter la longueur de la boucle for.
la source
"\\\n"
plutôt que"\n"
?utiliser HTML au lieu de javascript
la source
J'ai un peu adapté la solution par @steco, en basculant la dépendance de
d3
àjquery
et en ajoutant l'height
élément de texte en paramètrela source