Html2canvas: 'SVGElement.offsetWidth' tidak digunakan lagi dan akan dihapus di M50, sekitar April 2016

Dibuat pada 9 Apr 2016  ·  26Komentar  ·  Sumber: niklasvh/html2canvas

Google telah menolak untuk mendukung "offsetWidth" untuk SVG.
Ada ide?

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

Komentar yang paling membantu

Saya telah menyelesaikannya... Saya akan menambahkan solusi pada akhir minggu jika saya
punya waktu. Maaf atas keterlambatannya... Ini berfungsi di FF, Safari, dan Chrome.
Terbaik.
Pada hari Rabu, 29 Jun 2016 pukul 19:00, Yuki K [email protected] menulis:

@Dayjo https://github.com/Dayjo Ya, saya juga memperhatikan ini. SVG adalah
benar-benar dalam posisi yang salah dan hampir selalu keluar dari layar sekarang
semua offset*s dievaluasi menjadi tidak terdefinisi. Saya juga mencoba memecahkan
ini menggunakan getBoundingClientRect rekursif - tetapi tidak berhasil :( Saya akan mengambil
lihat cabangmu.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/niklasvh/html2canvas/issues/846#issuecomment -229420457,
atau matikan utasnya
https://github.com/notifications/unsubscribe/ABWsecUQ2l-rxisMZ4HCKu1nh-mbIMU1ks5qQqSQgaJpZM4IDr12
.

Semua 26 komentar

Baru saja akan menaikkan ini! Sedikit khawatir sesuatu akan berhenti bekerja bulan ini.

Ya, ternyata di Opera 37 beta tidak berfungsi. Selain itu, versi terbaru dari masalah plug-in untuk menampilkan latar belakang dan perbatasan. Saya punya satu, mereka tidak memeriksa?

Dalam demo juga, latar belakang dan batas tidak ditampilkan ((

Ini adalah masalah besar karena SVG kami tidak akan lagi dirender.

Pelaku terbesar ada di dalam fungsi ini:

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

Semua offsetTop, offsetLeft, offsetWidth, offsetHeight sekarang tidak ditentukan untuk SVG

Solusi yang disarankan adalah getBoundingClientRect() , tetapi masih tidak dapat membuatnya berfungsi.

Apakah ada yang punya solusi untuk ini?

@MarcBalaban Saya belum mencobanya, tetapi apakah itu tidak hanya menambahkan ini ke atas pengembalian dalam fungsi itu;

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

@Dayjo sayangnya tidak, itu pasti di jalur yang benar, tapi jalur ini

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

tidak dieksekusi dengan baik baik sebagai offsetParent juga telah disusutkan:

Hmm ya, melihat lebih jauh ke dalamnya, mungkin perlu menggunakan sesuatu seperti fungsi getBoundingBoxInArbitrarySpace di sini; https://svn.Apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js sesuai http://stackoverflow.com /questions/5996005/how-to-use-element-offsetparent-with-html-svg-elements#answers

Belum memiliki kesempatan untuk melakukan pengujian apa pun.

Ada berita tentang masalah ini? Terima kasih!

@chemitaxis - meskipun ada peringatan, sejauh ini saya tidak punya masalah dengan hasil html2canvas. Namun, siapa yang tahu jika / kapan perubahan ini benar-benar akan diterapkan di Chrome

Sepertinya ini sekarang telah berhenti bekerja Chrome. SVG tampaknya tidak dirender sama sekali, salah, atau pada skala / posisi yang salah di kanvas.

@niklasvh - ada pemikiran tentang ini? Jika saya punya waktu, saya akan dengan senang hati memperbaikinya tetapi saya choca saat ini.

Saya mencoba ini menggunakan https://svn.Apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/src/javascript/scxml/cgf/util/svg.js

Tetapi tidak yakin di mana saya perlu mengimplementasikannya, saya mencoba di kedua fungsi offsetBounds dan getBounds tetapi tidak berhasil. Koordinat X dan Y tampaknya benar, tetapi lebar dan tinggi semuanya salah, tidak yakin apakah ini karena saya menggunakan css untuk membuat SVG 100% lebar wadah dan tinggi otomatis. Perlu melakukan beberapa pengujian yang lebih ekstensif.

Saya memiliki cabang awal yang terjadi di sini ( https://github.com/Dayjo/html2canvas/tree/issue-846 ), menggunakan komit beta terbaru. jika ada yang ingin menguji, harus dapat menggunakan versi dist , atau hanya membangun kembali jika Anda mau. Tidak tahu seberapa baik / jika sama sekali itu akan berhasil.

@Dayjo Ya, saya juga memperhatikan ini. SVG benar-benar berada di posisi yang salah dan hampir selalu keluar dari layar sekarang karena semua offset* dievaluasi menjadi tidak terdefinisi. Saya juga mencoba menyelesaikan ini menggunakan getBoundingClientRect rekursif - tetapi tidak berhasil :( Saya akan melihat cabang Anda.

Saya telah menyelesaikannya... Saya akan menambahkan solusi pada akhir minggu jika saya
punya waktu. Maaf atas keterlambatannya... Ini berfungsi di FF, Safari, dan Chrome.
Terbaik.
Pada hari Rabu, 29 Jun 2016 pukul 19:00, Yuki K [email protected] menulis:

@Dayjo https://github.com/Dayjo Ya, saya juga memperhatikan ini. SVG adalah
benar-benar dalam posisi yang salah dan hampir selalu keluar dari layar sekarang
semua offset*s dievaluasi menjadi tidak terdefinisi. Saya juga mencoba memecahkan
ini menggunakan getBoundingClientRect rekursif - tetapi tidak berhasil :( Saya akan mengambil
lihat cabangmu.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub
https://github.com/niklasvh/html2canvas/issues/846#issuecomment -229420457,
atau matikan utasnya
https://github.com/notifications/unsubscribe/ABWsecUQ2l-rxisMZ4HCKu1nh-mbIMU1ks5qQqSQgaJpZM4IDr12
.

@chemitaxis Luar biasa! Menantikan untuk memperbaikinya.

Hai @chemitaxis , bisakah Anda membuat PR atau tautan ke garpu Anda jika Anda punya waktu?

@chemitaxis ada kemajuan dalam hal ini? Saya berharap untuk menguji kode pada proyek yang saya lakukan untuk melihat apakah itu menyelesaikan semua masalah SVG saya terutama dengan IE.

Hai @atdiff :) Saya telah memecahkan masalah menggunakan perpustakaan lain ...

Ini bukan perbaikan tetapi saya memang menemukan solusi kecil. Saya juga tidak bisa menampilkan SVG dengan benar di Chrome tetapi akan ditampilkan di Safari. Yang saya lakukan hanyalah menambahkan atribut lebar ke elemen sebaris SVG. Bahkan dengan atribut lebar yang tidak akurat, itu dicetak seperti seharusnya di Chrome dan 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;

Sunting: Sesuatu untuk ditambahkan yang tidak terkait tetapi yang lain mungkin berguna saat mencari di sini. Firefox sepertinya tidak berfungsi dengan metode saya di atas. SVG saya memiliki # tanda untuk warna hex (mis: #ccc). Karena ini adalah karakter yang dicadangkan di URL dan Firefox sangat ketat tentang hal itu, SVG tidak muncul. Saya menggantinya dengan nilai rgb dan sekarang Firefox ditampilkan dengan benar.

@jgunderson-IAS terima kasih untuk ini, saya akan mencobanya sebagai solusi cepat.

Mudah-mudahan saya akan mendapatkan kesempatan untuk menghabiskan satu hari melihat bug ini, yah, mungkin setengah hari untuk ini, lalu setengah hari untuk apa saya menggunakannya, tetapi seharusnya memberi saya kesempatan untuk mengimplementasikan a solusi nyata.

@niklasvh tidak yakin apakah Anda telah melihat ini sama sekali, atau jika Anda memiliki saran tentang cara terbaik untuk menerapkan perbaikan (lihat: https://github.com/niklasvh/html2canvas/issues/846#issuecomment-229035694 )

@jgunderson-IAS Saya telah secara eksplisit mengatur ukuran SVG, dan sementara pendekatan hacky ini berarti bahwa mereka dirender, sepertinya ukurannya tidak konsisten, saya mengatur properti tinggi dan berat, namun mereka secara teratur muncul 'terjepit '. Sayangnya halaman saya bergantung pada ukuran svg yang dikendalikan oleh CSS dan menjadi 100% dari wadah mereka, jadi sementara ini adalah batu loncatan, saya pikir saya harus melihat pengodean ulang perpustakaan untuk menghitung ukuran dengan benar

Berikut adalah contoh bagaimana svgs dirender sekarang setelah saya mengatur lebar pada acara 'onClone' berdasarkan lebar elemen induk (semua svgs disetel ke lebar 100% dalam css), tinggi tampaknya semakin mengacaukannya;

html

image

kanvas

image

Saya menggunakan;

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

Sepertinya itu sangat tergantung pada svg itu sendiri tentang seberapa baik rasio aspeknya. Misalnya svg (daun) pertama, lebih banyak terjepit daripada dua lainnya.

Sayangnya saya harus meninggalkan penggunaan html2canvas dan menggunakan solusi sisi server sebagai gantinya ( wkhtmltoimage ) secara khusus karena itu tidak dapat membuat svgs secara akurat. Saya tidak dapat membuatnya berfungsi menggunakan getBoundingClientRect atau getBBox dll

Tetap di 1.0.0

Apakah halaman ini membantu?
0 / 5 - 0 peringkat