(Lo siento, no soy bueno en inglés)
Hola,
Estoy usando este impresionante script para renderizar etiquetas SVG
Hay algo de texto superpuesto cuando renderizo la etiqueta de texto en SVG en el lienzo
La etiqueta de texto se procesará como un nodo de texto y también como SVG
Puedes ver eso fácilmente con la propiedad transform
Aquí hay un código de muestra (con html2canvas 0.5.0-alpha2)
<html>
<head>
<script src="https://code.jquery.com/jquery-1.11.2.min.js"></script>
<script type="text/javascript" src="js/html2canvas.js"></script>
</head>
<body>
<svg width="100" height="100">
<g transform="translate(20,20)">
<text dy=".45em" y="10" x="0" dx="-.8em" transform="translate(0,0) rotate(-70)" style="font-size:12px;">Text</text>
</g>
</svg>
<script>
$(document).ready(function() {
html2canvas(document.body, {
onrendered: function(canvas) {
document.body.appendChild(canvas);
}
});
})
</script>
</body>
</html
Y aqui esta mi cambio rapido
NodeParser.prototype.getChildren = function(parentContainer) {
return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
var container = [node.nodeType === Node.TEXT_NODE && node.parentElement.tagName !== "text" ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
}, this));
};
Espero que esto sea de ayuda
Gracias # Hyojin. Eso me ayuda.
Gracias, ayúdame mucho!
¡Gracias por tu corrección!
también puede comprobar tspan tagName:
node.nodeType === Node.TEXT_NODE && node.parentElement.tagName! == "text" && node.parentElement.tagName! == "tspan"
@ncoquelet Actualicé mi código . ¡Gracias!
@hyojin
Después de probarlo en IE, su solución no funciona porque la propiedad parentElement
no se completa en el nodo actual. ¡Utilice parentNode
lugar! En cualquier caso, será más claro porque estamos en el NodeParser
y hablamos de nodo.
De lo contrario, en lugar de probar el nombre de la etiqueta, cambio mi código para probar la instancia de parentNode
y procesar que el nodo actual tenga un TextContainer
solo si el parentNode no es un SVGElement
.
Funciona en Chrome e IE11. en Firefox no puedo probarlo debido a un error de lienzo en blanco.
Mi código
NodeParser.prototype.getChildren = function(parentContainer) {
return flatten([].filter.call(parentContainer.node.childNodes, renderableNode).map(function(node) {
var container = [node.nodeType === Node.TEXT_NODE && !(node.parentNode instanceof SVGElement) ? new TextContainer(node, parentContainer) : new NodeContainer(node, parentContainer)].filter(nonIgnoredElement);
return node.nodeType === Node.ELEMENT_NODE && container.length && node.tagName !== "TEXTAREA" ? (container[0].isElementVisible() ? container.concat(this.getChildren(container[0])) : []) : container;
}, this));
};
Espero que esto ayude.
soluciono mi problema de firefox, también funciona en ff :-)
¡Mas claro!
También verifiqué que funciona bien en ff.
Fusioné tu corrección y se actualizó la solicitud de extracción. Gracias :)
@hyojin @ncoquelet gracias por la investigación de esto y la solución. Me encontré exactamente con el mismo problema el otro día y no estaba completamente seguro de qué lo estaba causando.
No estoy seguro de dónde me estoy confundiendo aquí, pero obtengo la excepción como "Error de referencia no detectado: NodeParser no está definido"
@ Suchetana10 ¿ Cuándo recibió la excepción? en el script de carga?
@hyojin gracias ... funcionó para mí
@hyojin gracias! funciona perfectamente para mi tambien
happyvishwasvadavi ugnugen ¡Estoy feliz de escuchar eso! :)
Algunas personas todavía tienen el problema con el elemento de texto, cambio este problema abierto y enviaré PR nuevamente.
¿Alguien tiene una compilación de la biblioteca con esta solución que pueda probar? Viendo el mismo problema en la página de highcharts.
¿Esta compilación está disponible con la corrección? Todavía me enfrento a este problema con highcharts.
¿Esta corrección está disponible en la compilación o tenemos que crear una anulación?
Este problema se ha cerrado automáticamente porque no ha habido respuesta a nuestra solicitud de más información del autor original. Con solo la información que se encuentra actualmente en el problema, no tenemos suficiente información para tomar medidas. Comuníquese con nosotros si tiene o encuentre las respuestas que necesitamos para que podamos investigar más.
Estimado @niklasvh ,
Gracias por esta increíble biblioteca. Puedo reproducir este problema con la última versión: v1.0.0-rc.3
He creado un ejemplo en CodePen aquí (solo Chrome) donde verá que algunos de los nodos de texto (en el título del gráfico) están duplicados.
Pasos para reproducir -
Los títulos de los gráficos se agregan en la línea # 193
@hyojin , ¿podrías volver a abrir el problema?
Saludos,
Karan
Hola @karannagupta
¿Podrías probar mi rama para comprobar si proviene del mismo motivo?
Hola @hyojin
Con su versión de la biblioteca (v0.5.0-alpha2) no funciona. Puedes probar tu biblioteca en mi Pen aquí
Además, me gustaría utilizar la última versión de html2canvas. Entonces tampoco necesito usar html2canvas.svg.
Saludos,
Karan
Resulta que es un problema con las fuentes Unicode
Comentario más útil
@hyojin
Después de probarlo en IE, su solución no funciona porque la propiedad
parentElement
no se completa en el nodo actual. ¡UtiliceparentNode
lugar! En cualquier caso, será más claro porque estamos en elNodeParser
y hablamos de nodo.De lo contrario, en lugar de probar el nombre de la etiqueta, cambio mi código para probar la instancia de
parentNode
y procesar que el nodo actual tenga unTextContainer
solo si el parentNode no es unSVGElement
.Funciona en Chrome e IE11. en Firefox no puedo probarlo debido a un error de lienzo en blanco.
Mi código
Espero que esto ayude.