Html2canvas: 'SVGElement.offsetWidth' está obsoleto y se eliminará en M50, alrededor de abril de 2016

Creado en 9 abr. 2016  ·  26Comentarios  ·  Fuente: niklasvh/html2canvas

Google se ha negado a admitir "offsetWidth" para SVG.
¿Hay ideas?

Documento: https://www.chromestatus.com/features/5724912467574784

Comentario más útil

Lo he resuelto ... agregaré la solución al final de la semana si
tener tiempo. Perdón por la demora ... Está funcionando en FF, Safari y Chrome.
Mejor.
El miércoles 29 de junio de 2016 a las 19:00, Yuki K [email protected] escribió:

@Dayjo https://github.com/Dayjo Sí, yo también me di cuenta de esto. Los SVG son
totalmente en la posición incorrecta y casi siempre están fuera de la pantalla ahora que
todos los desplazamientos * s se evalúan como indefinidos. También intenté resolver
esto usando getBoundingClientRect recursivo - pero sin suerte :( Tomaré un
mira tu rama.

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/niklasvh/html2canvas/issues/846#issuecomment -229420457,
o silenciar el hilo
https://github.com/notifications/unsubscribe/ABWsecUQ2l-rxisMZ4HCKu1nh-mbIMU1ks5qQqSQgaJpZM4IDr12
.

Todos 26 comentarios

¡Estaba a punto de plantear esto! Un poco preocupado, algo dejará de funcionar este mes.

Sí, aparentemente en la beta de Opera 37 no funciona. Además, la última versión del complemento tiene problemas para mostrar fondos y bordes. Yo tengo uno, no lo revisan?

En la demostración también, los fondos y los bordes no se muestran ((

Este es un gran problema ya que nuestros SVG ya no se procesarán.

El mayor culpable está dentro de esta función:

function offsetBounds(node) {
    var parent = node.offsetParent ? offsetBounds(node.offsetParent) : {top: 0, left: 0};

    return {
        top: node.offsetTop + parent.top,
        bottom: node.offsetTop + node.offsetHeight + parent.top,
        right: node.offsetLeft + parent.left + node.offsetWidth,
        left: node.offsetLeft + parent.left,
        width: node.offsetWidth,
        height: node.offsetHeight
    };
}

lines 1887 - 1898 en html2canvas.js

Todos los offsetTop, offsetLeft, offsetWidth, offsetHeight ahora no están definidos para SVG

La solución recomendada es getBoundingClientRect() , pero aún así no funciona.

¿Alguien tiene una solución para esto?

@MarcBalaban No lo he probado todavía, pero ¿no sería solo agregar esto arriba del retorno en esa función?

if ( node.tagName === 'SVG' ) {
    return node.getBoundingClientRect();
  }

@Dayjo lamentablemente no, definitivamente está en el camino correcto, pero esta línea

var parent = node.offsetParent ? offsetBounds(node.offsetParent) : {top: 0, left: 0};

tampoco se ejecuta correctamente ya que offsetParent también se ha depreciado:

Hmm sí, mirándolo un poco más, puede que necesite usar algo como la función getBoundingBoxInArbitrarySpace aquí; https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js según http://stackoverflow.com / questions / 5996005 / how-to-use-element-offsetparent-with-html-svg-elements # answers

Sin embargo, todavía no he tenido la oportunidad de hacer ningún tipo de prueba.

¿Alguna noticia sobre este tema? ¡Gracias!

@chemitaxis : a pesar de la advertencia, hasta ahora no he tenido ningún problema con el resultado de html2canvas. Sin embargo, quién sabe si y cuándo se implementará este cambio en Chrome.

Parece que esto ha dejado de funcionar Chrome. Parece que los SVG no se representan en absoluto, de forma incorrecta o en la escala incorrecta / en la posición en el lienzo.

@niklasvh - ¿

Tuve una oportunidad de esto usando https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js

Pero no estaba seguro de dónde necesitaba implementarlo, probé tanto en la función offsetBounds como en la función getBounds pero fue en vano. Las coordenadas X e Y parecen ser correctas, pero el ancho y la altura son incorrectos, no estoy seguro de si esto se debe a que estoy usando css para hacer que el SVG sea el 100% del ancho del contenedor y la altura automática. Necesitaría hacer algunas pruebas más extensas.

Tengo una rama preliminar en marcha aquí (https://github.com/Dayjo/html2canvas/tree/issue-846), usando la última confirmación beta. si alguien quiere probar, debería poder usar la versión dist , o simplemente reconstruir si lo desea. No tengo idea de qué tan bien / si es que funcionará.

@Dayjo Sí, yo también me di cuenta de esto. Los SVG están totalmente en la posición incorrecta y casi siempre están fuera de la pantalla ahora que todos los desplazamientos * se evalúan como indefinidos. También intenté resolver esto usando getBoundingClientRect recursivo, pero no tuve suerte :( Echaré un vistazo a su rama.

Lo he resuelto ... agregaré la solución al final de la semana si
tener tiempo. Perdón por la demora ... Está funcionando en FF, Safari y Chrome.
Mejor.
El miércoles 29 de junio de 2016 a las 19:00, Yuki K [email protected] escribió:

@Dayjo https://github.com/Dayjo Sí, yo también me di cuenta de esto. Los SVG son
totalmente en la posición incorrecta y casi siempre están fuera de la pantalla ahora que
todos los desplazamientos * s se evalúan como indefinidos. También intenté resolver
esto usando getBoundingClientRect recursivo - pero sin suerte :( Tomaré un
mira tu rama.

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/niklasvh/html2canvas/issues/846#issuecomment -229420457,
o silenciar el hilo
https://github.com/notifications/unsubscribe/ABWsecUQ2l-rxisMZ4HCKu1nh-mbIMU1ks5qQqSQgaJpZM4IDr12
.

@chemitaxis ¡Impresionante! Esperando la solución.

Hola @chemitaxis , ¿puedes crear un PR o un enlace a tu bifurcación si tienes tiempo?

@chemitaxis ¿ algún progreso en esto? Espero probar el código en un proyecto que estoy haciendo para ver si resuelve todos mis problemas de SVG, especialmente con IE.

Hola @atdiff :) He resuelto el problema usando otras bibliotecas ...

No es una solución, pero encontré una pequeña solución. Tampoco pude hacer que SVG se mostrara correctamente en Chrome, pero se mostraría en Safari. Todo lo que hice fue agregar un atributo de ancho al elemento en línea SVG. Incluso con un atributo de ancho inexacto, se imprimió como debería tanto en Chrome como en Safari:

    var deferred = $q.defer();

    element.find('svg').attr('width', '100px');

    html2canvas(element, {
        background: '#eee',
        onrendered: function(canvas) {
            var a = document.createElement('a');
            a.href = canvas.toDataURL('image/jpeg', 1).replace('image/jpeg', 'image/octet-stream');
            a.download = fileName + '.jpg';
            a.click();
            deferred.resolve();
        }
    });

    return deferred.promise;

Editar: algo para agregar que no está relacionado, pero otros pueden resultar útiles al buscar aquí. Firefox no pareció funcionar con mi método anterior. Mi SVG tenía signos # para los colores hexadecimales (por ejemplo: #ccc). Dado que estos son caracteres reservados en las URL y Firefox es estricto al respecto, el SVG no apareció. Reemplacé con valores rgb en su lugar y ahora Firefox se muestra correctamente.

@ jgunderson-IAS gracias por esto. Lo intentaré como una solución rápida.

Espero tener la oportunidad de pasar un día mirando este error, bueno, tal vez medio día en esto, luego medio día en lo que lo estoy usando, pero debería darme la oportunidad de implementar posiblemente un solución real.

@niklasvh no estoy seguro si ha mirado esto en absoluto, o si tiene alguna sugerencia sobre la mejor manera de implementar una solución (consulte: https://github.com/niklasvh/html2canvas/issues/846#issuecomment-229035694 )

@ jgunderson-IAS He estado estableciendo explícitamente el tamaño de los SVG, y aunque este enfoque hacky significa que se renderizan, parece que el tamaño es inconsistente, estoy estableciendo propiedades de altura y peso y, sin embargo, aparecen regularmente 'aplastadas '. Desafortunadamente, mis páginas se basan en que los tamaños de svg están controlados por CSS y son el 100% de su contenedor, por lo que si bien este es un trampolín, creo que tendré que mirar la recodificación de la biblioteca para calcular correctamente los tamaños.

Aquí hay un ejemplo de cómo se representan los svgs ahora que estoy configurando el ancho en el evento 'onClone' en función del ancho del elemento principal (todos los svgs están configurados al 100% de ancho en css), la altura parece estropearlo aún más;

html

image

lienzo

image

Estoy usando;

onclone: function(doc){
    var w,h;
    var svgs = doc.querySelectorAll('svg');
    for ( var s = 0; s < svgs.length; ++s ) {
        w = svgs[s].parentElement.offsetWidth;
        svgs[s].setAttribute('width', w );
    }
}

Parece que realmente depende del svg en sí mismo en cuanto a qué tan bien representa su relación de aspecto. Por ejemplo, el primer svg (hoja) está mucho más aplastado que los otros dos.

Desafortunadamente, tuve que abandonar el uso de html2canvas y usar una solución del lado del servidor en su lugar ( wkhtmltoimage ) específicamente porque no puede representar svgs con precisión. No pude hacerlo funcionar usando getBoundingClientRect o getBBox etc.

Corregido en 1.0.0

¿Fue útil esta página
0 / 5 - 0 calificaciones