Html2canvas: 'SVGElement.offsetWidth' ist veraltet und wird etwa im April 2016 in M50 entfernt

Erstellt am 9. Apr. 2016  ·  26Kommentare  ·  Quelle: niklasvh/html2canvas

Google hat sich geweigert, "offsetWidth" für SVG zu unterstützen.
Gibt es Ideen?

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

Hilfreichster Kommentar

Ich habe es gelöst... Ich werde die Lösung am Ende der Woche hinzufügen, wenn ich
Zeit haben. Entschuldigung für die Verzögerung... Es funktioniert auf FF, Safari und Chrome.
Am besten.
Am Mittwoch, den 29. Juni 2016 um 19:00 Uhr schrieb Yuki K [email protected] :

@Dayjo https://github.com/Dayjo Ja, das ist mir auch aufgefallen. SVGs sind
total in der falschen Position und sind jetzt fast immer aus dem Bildschirm
alle Offset*s werden als undefiniert ausgewertet. Ich habe mich auch am Lösen versucht
dies mit rekursivem getBoundingClientRect - aber kein Glück :( Ich nehme ein
schau dir deine Filiale an.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/niklasvh/html2canvas/issues/846#issuecomment -229420457,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe/ABWsecUQ2l-rxisMZ4HCKu1nh-mbIMU1ks5qQqSQgaJpZM4IDr12
.

Alle 26 Kommentare

War gerade dabei, das anzuheben! Etwas besorgt, dass etwas diesen Monat einfach nicht mehr funktioniert.

Ja, anscheinend funktioniert die Opera 37 Beta nicht. Außerdem hat die neueste Version des Plug-Ins Probleme mit der Anzeige von Hintergründen und Rändern. Ich habe eine, sie überprüfen nicht?

Auch in der Demo werden Hintergründe und Rahmen nicht angezeigt ((

Dies ist ein großes Problem, da unsere SVGs nicht mehr gerendert werden.

Der größte Übeltäter liegt in dieser Funktion:

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 in html2canvas.js

Alle offsetTop, offsetLeft, offsetWidth, offsetHeight sind jetzt für SVGs nicht definiert

Die empfohlene Lösung ist getBoundingClientRect() , kann aber immer noch nicht funktionieren.

Hat jemand eine Lösung dafür?

@MarcBalaban Ich habe es noch nicht ausprobiert, aber würde dies nicht nur über der Rückgabe in dieser Funktion hinzugefügt werden

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

@Dayjo leider nicht, es ist definitiv auf dem richtigen Weg, aber diese Linie

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

wird auch nicht richtig ausgeführt, da offsetParent ebenfalls abgeschrieben wurde:

Hmm ja, wenn man sich das ein bisschen genauer ansieht, muss es vielleicht so etwas wie die getBoundingBoxInArbitrarySpace-Funktion hier verwenden; https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js gemäß http://stackoverflow.com /questions/5996005/how-to-use-element-offsetparent-with-html-svg-elements#answers

Hatte aber noch keine Gelegenheit zu irgendwelchen Tests.

Gibt es Neuigkeiten zu diesem Thema? Vielen Dank!

@chemitaxis - trotz der Warnung hatte ich bisher keine Probleme mit dem Ergebnis von html2canvas. Aber wer weiß, ob/wann diese Änderung tatsächlich in Chrome umgesetzt wird

Sieht so aus, als ob Chrome jetzt nicht mehr funktioniert. SVGs scheinen entweder gar nicht, falsch oder im falschen Maßstab / an der Position im Canvas gerendert zu werden.

@niklasvh - irgendwelche Gedanken dazu? Wenn ich die Zeit hätte, würde ich gerne eine Party machen, aber im Moment bin ich Choca.

Ich hatte eine Chance mit https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js

Aber ich war mir nicht sicher, wo ich es implementieren musste, ich habe es sowohl in der offsetBounds als auch in der getBounds Funktion versucht, aber ohne Erfolg. Die X- und Y-Koordinaten scheinen korrekt zu sein, aber die Breite und Höhe sind alle falsch. Müsste noch etwas umfangreicher testen.

Ich habe hier einen vorläufigen Branch (https://github.com/Dayjo/html2canvas/tree/issue-846) mit dem neuesten Beta-Commit. Wenn jemand testen möchte, sollte er die Version dist können oder einfach neu erstellen, wenn Sie möchten. Keine Ahnung wie gut/ob das überhaupt geht.

@Dayjo Ja, das ist mir auch aufgefallen. SVGs befinden sich völlig an der falschen Position und sind fast immer außerhalb des Bildschirms, da alle Offsets als undefiniert ausgewertet werden. Ich habe mich auch versucht, dies mit rekursivem getBoundingClientRect zu lösen - aber kein Glück :( Ich werde mir Ihren Zweig ansehen.

Ich habe es gelöst... Ich werde die Lösung am Ende der Woche hinzufügen, wenn ich
Zeit haben. Entschuldigung für die Verzögerung... Es funktioniert auf FF, Safari und Chrome.
Am besten.
Am Mittwoch, den 29. Juni 2016 um 19:00 Uhr schrieb Yuki K [email protected] :

@Dayjo https://github.com/Dayjo Ja, das ist mir auch aufgefallen. SVGs sind
total in der falschen Position und sind jetzt fast immer aus dem Bildschirm
alle Offset*s werden als undefiniert ausgewertet. Ich habe mich auch am Lösen versucht
dies mit rekursivem getBoundingClientRect - aber kein Glück :( Ich nehme ein
schau dir deine Filiale an.


Sie erhalten dies, weil Sie erwähnt wurden.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/niklasvh/html2canvas/issues/846#issuecomment -229420457,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe/ABWsecUQ2l-rxisMZ4HCKu1nh-mbIMU1ks5qQqSQgaJpZM4IDr12
.

@chemitaxis Genial ! Freue mich auf die Korrektur.

Hey @chemitaxis , kannst du eine PR oder einen Link zu deinem Fork erstellen, wenn du Zeit hast?

@chemitaxis irgendwelche Fortschritte diesbezüglich? Ich hoffe, den Code in einem Projekt testen zu können, das ich gerade mache, um zu sehen, ob es alle meine SVG-Probleme löst, insbesondere mit IE.

Hallo @atdiff :) Ich habe das Problem mit anderen Bibliotheken gelöst ...

Es ist kein Fix, aber ich habe einen kleinen Workaround gefunden. Ich konnte SVG auch nicht richtig in Chrome anzeigen, aber es würde in Safari angezeigt. Alles, was ich getan habe, war, dem SVG-Inline-Element ein width-Attribut hinzuzufügen. Selbst mit einem ungenauen Breitenattribut wird es so ausgedruckt, wie es sowohl in Chrome als auch in Safari sein sollte:

    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;

Bearbeiten: Etwas hinzuzufügen, das nicht zusammenhängt, aber andere können bei der Suche hier nützlich sein. Firefox schien mit meiner obigen Methode nicht zu funktionieren. Mein SVG hatte # Zeichen für die Hex-Farben (zB: #ccc). Da es sich um reservierte Zeichen in URLs handelt und Firefox streng damit umgeht, wurde die SVG nicht angezeigt. Ich habe stattdessen durch RGB-Werte ersetzt und jetzt wird Firefox korrekt angezeigt.

@jgunderson-IAS danke dafür, ich werde es als schnellen Workaround versuchen.

Ich werde hoffentlich die Gelegenheit bekommen, einen Tag damit zu verbringen, diesen Fehler zu betrachten, nun, vielleicht einen halben Tag damit, dann einen halben Tag mit dem, wofür ich ihn verwende, aber sollte mir die Möglichkeit geben, möglicherweise einen zu implementieren echte Lösung.

@niklasvh nicht sicher, ob Sie sich das überhaupt angesehen haben oder ob Sie Vorschläge haben, wie Sie am besten einen Fix implementieren (siehe: https://github.com/niklasvh/html2canvas/issues/846#issuecomment-229035694 )

@jgunderson-IAS Ich habe die Größe von SVGs explizit festgelegt, und obwohl dieser hackige Ansatz bedeutet, dass sie gerendert werden, scheint die Größe inkonsistent zu sein '. Leider verlassen sich meine Seiten darauf, dass die SVG-Größen von CSS gesteuert werden und 100% ihres Containers ausmachen

Hier ist ein Beispiel dafür, wie SVGs jetzt rendern, da ich die Breite des 'onClone'-Ereignisses basierend auf der Breite des übergeordneten Elements festlege (alle SVGs sind in CSS auf 100% Breite eingestellt), Höhe scheint es noch mehr durcheinander zu bringen;

html

image

Segeltuch

image

Ich benutze;

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 );
    }
}

Es scheint, als ob es wirklich von der SVG selbst abhängt, wie gut sie ihr Seitenverhältnis rendert. Zum Beispiel ist die erste (Blatt-)Svg viel mehr gequetscht als die anderen beiden.

Leider musste ich die Verwendung von html2canvas aufgeben und stattdessen eine serverseitige Lösung verwenden ( wkhtmltoimage ), insbesondere weil sie SVGs nicht genau rendern kann. Ich konnte es mit getBoundingClientRect oder getBBox usw. nicht zum Laufen bringen

Behoben in 1.0.0

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen