Pustaka mengembalikan gambar kosong saat isi dokumen lebih dari 30.000 piksel. Anda akan mencoba untuk menangkap elemen 100 x 100. Tetapi Anda mendapatkan gambar kosong dari elemen tersebut pada tubuh yang tinggi.
Berikut adalah biola yang menunjukkan kesalahan ini.
https://jsfiddle.net/fvo1xh8b/2/
Anda dapat mengubah ukuran tubuh kurang dari 30.000 dan berfungsi dengan baik.
Saya memiliki masalah yang sama persis seperti Anda. Apakah Anda menemukan solusi untuk ini?
emm, saya mendapat masalah yang sama, tetapi akhirnya, saya tahu!
dalam kasus saya, inilah solusi saya:
letakkan iframe di elemen tubuh Anda, seperti
<html>
<head>
#canvas_handler {
position:absolute;
left: -10000px;
}
</head>
<body>
<iframe id="canvas_handler" />
</body>
</html>
dan setiap elemen yang Anda perlukan untuk disembunyikan ke kanvas, Anda dapat menyalin dan meletakkannya di iframe ini, dan menggunakan html2canvas, lalu menghapusnya, seperti ini
const copy_ele = origin_ele.cloneNode(true);
canvas_handler.appendChild(copy_ele);
canvas_handler.style.height = origin_ele.scrollHeight;
canvas_handler.style.width = origin_ele.scrollWidth;
html2canvas(copy_ele, {
useCORS: true,
}).then((canvas) => {
// do your things
});
canvas_handler.removeChild(table_ele);
Masalah ini telah ditutup secara otomatis karena belum ada tanggapan atas permintaan kami untuk informasi lebih lanjut dari penulis asli. Dengan hanya informasi yang sedang dalam masalah, kami tidak memiliki cukup informasi untuk mengambil tindakan. Harap hubungi jika Anda memiliki atau menemukan jawaban yang kami butuhkan sehingga kami dapat menyelidiki lebih lanjut.
hai ketika saya mencoba menyaring iframe dengan kamera ip internal, itu mengembalikan gambar kosong, tolong bisakah Anda membantu saya?
@niklasvh Ini yang sulit tetapi sebenarnya karena keterbatasan ukuran kanvas. Saya kira ini perlu dibuka kembali untuk membahas bagaimana menerapkan perilaku yang benar. Jelas gambar yang dicuci putih bukanlah perilaku yang benar.
Dalam kasus saya, saya mengkloning seluruh tubuh dan hanya mengatur max width/height: html2canvas(el, {height: 3000, width: 3000})
.
@toadkicker saudara, Anda menyimpan kode / pekerjaan saya hari ini hahahahahahahaht terima kasih banyak
@toadkicker Terima kasih!
emm, saya mendapat masalah yang sama, tetapi akhirnya, saya tahu!
dalam kasus saya, inilah solusi saya:
letakkan iframe di elemen tubuh Anda, seperti<html> <head> #canvas_handler { position:absolute; left: -10000px; } </head> <body> <iframe id="canvas_handler" /> </body> </html>
dan setiap elemen yang Anda perlukan untuk disembunyikan ke kanvas, Anda dapat menyalin dan meletakkannya di iframe ini, dan menggunakan html2canvas, lalu menghapusnya, seperti ini
const copy_ele = origin_ele.cloneNode(true); canvas_handler.appendChild(copy_ele); canvas_handler.style.height = origin_ele.scrollHeight; canvas_handler.style.width = origin_ele.scrollWidth; html2canvas(copy_ele, { useCORS: true, }).then((canvas) => { // do your things }); canvas_handler.removeChild(table_ele);
Saya mencoba metode ini, tetapi tidak bekerja dengan tepat. Dalam cara saya, akan bekerja dengan kode di bawah ini:
const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
useCORS: true,
}).then((canvas) => {
// do your things
canvas_handler.removeChild(copy_ele);
});
Dan jika Anda ingin menerapkan gaya css Anda sama seperti di dokumen saat ini, Anda juga perlu menyalin gaya ke iframe:
// add style
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'your_style_file_url.css';
canvas_handler.contentDocument.head.appendChild(link);
const copy_ele = origin_ele.cloneNode(true);
canvas_handler.contentDocument.body.appendChild(copy_ele);
canvas_handler.height = origin_ele.scrollHeight;
canvas_handler.width = origin_ele.scrollWidth;
html2canvas(canvas_handler.contentDocument.body, {
useCORS: true,
}).then((canvas) => {
// do your things
canvas_handler.removeChild(copy_ele);
});
Sekali lagi ini adalah batasan di browser itu sendiri dan perpustakaan ini tidak menangani kesalahan dengan benar. Tidak ada solusi pengkodean selain membatasi jumlah piksel yang ditangkap yang akan mengubahnya.
emm, saya mendapat masalah yang sama, tetapi akhirnya, saya tahu!
dalam kasus saya, inilah solusi saya:
letakkan iframe di elemen tubuh Anda, seperti<html> <head> #canvas_handler { position:absolute; left: -10000px; } </head> <body> <iframe id="canvas_handler" /> </body> </html>
dan setiap elemen yang Anda perlukan untuk disembunyikan ke kanvas, Anda dapat menyalin dan meletakkannya di iframe ini, dan menggunakan html2canvas, lalu menghapusnya, seperti ini
const copy_ele = origin_ele.cloneNode(true); canvas_handler.appendChild(copy_ele); canvas_handler.style.height = origin_ele.scrollHeight; canvas_handler.style.width = origin_ele.scrollWidth; html2canvas(copy_ele, { useCORS: true, }).then((canvas) => { // do your things }); canvas_handler.removeChild(table_ele);
Saya mencoba metode ini, tetapi tidak bekerja dengan tepat. Dalam cara saya, akan bekerja dengan kode di bawah ini:
const copy_ele = origin_ele.cloneNode(true); canvas_handler.contentDocument.body.appendChild(copy_ele); canvas_handler.height = origin_ele.scrollHeight; canvas_handler.width = origin_ele.scrollWidth; html2canvas(canvas_handler.contentDocument.body, { useCORS: true, }).then((canvas) => { // do your things canvas_handler.removeChild(copy_ele); });
Dan jika Anda ingin menerapkan gaya css Anda sama seperti di dokumen saat ini, Anda juga perlu menyalin gaya ke iframe:
// add style const link = document.createElement('link'); link.rel = 'stylesheet'; link.href = 'your_style_file_url.css'; canvas_handler.contentDocument.head.appendChild(link); const copy_ele = origin_ele.cloneNode(true); canvas_handler.contentDocument.body.appendChild(copy_ele); canvas_handler.height = origin_ele.scrollHeight; canvas_handler.width = origin_ele.scrollWidth; html2canvas(canvas_handler.contentDocument.body, { useCORS: true, }).then((canvas) => { // do your things canvas_handler.removeChild(copy_ele); });
dalam kasus saya, semua elemen adalah svg atau gaya sebaris, jadi saya tidak perlu menambahkan stylesheet. tapi ya, Anda harus menambahkan stylesheet Anda jika diperlukan
Saya pernah menghadapi masalah yang sama. Saya perlu membuat gambar dari jendela modal (dengan posisi tetap). Saya selalu menerima gambar putih. Masalahnya ada di posisi gulir. Kode ini berfungsi untuk saya:
const el = document.getElementById('html-to-canvas-area')
const area = el.getBoundingClientRect()
html2canvas(el, {
scrollX: 0,
scrollY: 0,
width: area.width,
height: area.height
})
Bekerja untuk saya seperti pesona! Terima kasih atas solusi cerdasnya!
@invisor penyelamat! Itulah satu-satunya hal yang berhasil untuk saya.
Opsi ini mungkin juga merupakan solusi untuk menggulir kasus terkait
{
scrollX: 0,
scrollY: -window.scrollY
}
Komentar yang paling membantu
@niklasvh Ini yang sulit tetapi sebenarnya karena keterbatasan ukuran kanvas. Saya kira ini perlu dibuka kembali untuk membahas bagaimana menerapkan perilaku yang benar. Jelas gambar yang dicuci putih bukanlah perilaku yang benar.
Dalam kasus saya, saya mengkloning seluruh tubuh dan hanya mengatur max width/height:
html2canvas(el, {height: 3000, width: 3000})
.