Die Bibliothek gibt ein leeres Bild zurück, wenn der Textkörper des Dokuments mehr als 30.000 Pixel beträgt. Sie würden versuchen, ein Element von 100 x 100 zu erfassen. Sie erhalten jedoch ein leeres Bild des Elements auf einem großen Körper.
Hier ist eine Geige, die diesen Fehler demonstriert.
https://jsfiddle.net/fvo1xh8b/2/
Sie können die Körpergröße auf weniger als 30.000 ändern und es funktioniert gut.
ich habe genau das gleiche Problem wie du. Haben Sie hierfür eine Lösung gefunden?
emm, ich habe das gleiche Problem, aber endlich habe ich es herausgefunden!
In meinem Fall hier meine Lösung:
füge einen iframe in dein Körperelement ein, wie
<html>
<head>
#canvas_handler {
position:absolute;
left: -10000px;
}
</head>
<body>
<iframe id="canvas_handler" />
</body>
</html>
und jedes Element, das Sie auf die Leinwand übertragen müssen, können Sie kopieren und in diesen iframe einfügen und html2canvas verwenden und es dann wie folgt entfernen
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);
Ist das immer noch ein Problem mit v1.0.0 ? Wenn ja, könnten Sie bitte ein Beispiel auf jsfiddle teilen .
Dieses Problem wurde automatisch geschlossen, da unsere Anfrage nach weiteren Informationen vom ursprünglichen Autor nicht beantwortet wurde. Mit den Informationen, die derzeit in der Ausgabe enthalten sind, haben wir nicht genügend Informationen, um Maßnahmen zu ergreifen. Bitte wenden Sie sich an uns, wenn Sie die Antworten haben oder finden, die wir benötigen, damit wir weitere Nachforschungen anstellen können.
Hallo, wenn ich versuche, einen iframe mit einer internen IP-Kamera zu überprüfen, wird ein leeres Bild zurückgegeben. Können Sie mir bitte helfen?
@niklasvh Dies ist eine schwierige
In meinem Fall klone ich den gesamten Körper und setze nur die maximale Breite/Höhe: html2canvas(el, {height: 3000, width: 3000})
.
@toadkicker Bruder, du speicherst heute meinen Code/Job hahahahahahahaht vielen Dank
@toadkicker Danke!
emm, ich habe das gleiche Problem, aber endlich habe ich es herausgefunden!
In meinem Fall hier meine Lösung:
füge einen iframe in dein Körperelement ein, wie<html> <head> #canvas_handler { position:absolute; left: -10000px; } </head> <body> <iframe id="canvas_handler" /> </body> </html>
und jedes Element, das Sie auf die Leinwand übertragen müssen, können Sie kopieren und in diesen iframe einfügen und html2canvas verwenden und es dann wie folgt entfernen
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);
Ich habe diese Methode ausprobiert, funktioniert aber nicht genau. Auf meine Art funktioniert es mit folgendem Code:
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);
});
Und wenn Sie Ihren CSS-Stil wie im aktuellen Dokument anwenden möchten, müssen Sie auch den Stil in iframe kopieren:
// 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);
});
Auch dies ist eine Einschränkung im Browser selbst und diese Bibliothek behandelt den Fehler nicht richtig. Keine Codierungslösung außer der Begrenzung der Anzahl der erfassten Pixel wird dies ändern.
emm, ich habe das gleiche Problem, aber endlich habe ich es herausgefunden!
In meinem Fall hier meine Lösung:
füge einen iframe in dein Körperelement ein, wie<html> <head> #canvas_handler { position:absolute; left: -10000px; } </head> <body> <iframe id="canvas_handler" /> </body> </html>
und jedes Element, das Sie auf die Leinwand übertragen müssen, können Sie kopieren und in diesen iframe einfügen und html2canvas verwenden und es dann wie folgt entfernen
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);
Ich habe diese Methode ausprobiert, funktioniert aber nicht genau. Auf meine Art funktioniert es mit folgendem Code:
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); });
Und wenn Sie Ihren CSS-Stil wie im aktuellen Dokument anwenden möchten, müssen Sie auch den Stil in iframe kopieren:
// 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); });
In meinem Fall sind alle Elemente im SVG- oder Inline-Stil, sodass ich kein Stylesheet anhängen muss. aber ja, Sie sollten Ihr Stylesheet bei Bedarf hinzufügen
Ich habe das gleiche Problem gehabt. Ich musste ein Bild aus dem modalen Fenster (mit fester Position) erstellen. Ich habe immer ein weißes Bild erhalten. Das Problem lag in der Scroll-Position. Dieser Code funktioniert bei mir:
const el = document.getElementById('html-to-canvas-area')
const area = el.getBoundingClientRect()
html2canvas(el, {
scrollX: 0,
scrollY: 0,
width: area.width,
height: area.height
})
Hat für mich wie ein Zauber funktioniert! Danke für die clevere Lösung!
@invisor Lebensretter! Das ist das einzige was bei mir funktioniert hat.
Diese Option könnte auch eine Lösung für das Scrollen verwandter Fälle sein
{
scrollX: 0,
scrollY: -window.scrollY
}
Hilfreichster Kommentar
@niklasvh Dies ist eine schwierige
In meinem Fall klone ich den gesamten Körper und setze nur die maximale Breite/Höhe:
html2canvas(el, {height: 3000, width: 3000})
.