javascript - Html2canvas - document.getElementById(...).toDataURL 不是函数
问题描述
我想截取我的页面的屏幕截图。
我在这里找到的初始代码:
https://retifrav.github.io/blog/2018/07/23/html-js-screenshot/
在我的情况下看起来像这样:
function makeScreenshot() {
html2canvas(document.getElementById("screenshot"), {scale: 2}).then(canvas => {
canvas.id = "map";
canvas.crossOrigin = "Anonymous";
var main = document.getElementById("main");
while (main.firstChild) {
main.removeChild(main.firstChild);
}
console.log(main);
main.appendChild(canvas);
});
}
document.getElementById("a-make").addEventListener('click', function()
{
document.getElementById("a-make").style.display = "none";
makeScreenshot();
document.getElementById("a-download").style.display = "inline";
}, false);
document.getElementById("a-download").addEventListener('click', function()
{
this.href = document.getElementById("map").toDataURL();
this.download = "canvas-image.png";
}, false);
和 HTML:
<div id="map">
<div id="screenshot">
<div id="popup" class="ol-popup">
<a href="#" id="popup-closer" class="ol-popup-closer"></a>
<div id="popup-content"></div>
</div>
</div>
<a id="a-make" href="#">Make a screenshot</a>
<a id="a-download" href="#" style="display:none;">Download a screenshot</a>
</div>
控制台说:
未捕获(承诺中)TypeError:无法在 index.html:146 处读取 null 的属性“firstChild”
接下来
**Uncaught TypeError: document.getElementById(...).toDataURL is not a function
at HTMLAnchorElement.<anonymous> (index.html:164)**
我想这更重要,因为我无法导出我的屏幕截图。
我在这里找到了一些解决方案:
并尝试在我的代码中实现:
canvas.crossOrigin = "Anonymous";
就在下面
canvas.id = "map";
and
var canvas = document.getElementById('map').querySelector('canvas');
var dataURL = canvas.toDataURL();
就在上面
this.href = document.getElementById("map").innerHTML = dataURL();
this.download = "canvas-image.png";
}, false);
小提琴在这里
https://jsfiddle.net/kyzLfur3/
有谁知道问题可能出在哪里?
解决方案
你的id="map"
元素是一个div
. 他们没有toDataURL
。canvas
元素可以,但不是div
s。
在问题的其他地方,您会显示在其中寻找 a 的canvas
代码div
:
var canvas = document.getElementById('map').querySelector('canvas');
var dataURL = canvas.toDataURL();
因此,如果在某个时候 acanvas
被添加到 中#map
div
,您可能希望将其添加到您的click
处理程序中:
document.getElementById("a-download").addEventListener('click', function()
{
this.href = document.getElementById("map").querySelector('canvas').toDataURL();
// ^^^^^^^^^^^^^^^^^^^^^^^^−−−−−−−−−−−−−−−−
this.download = "canvas-image.png";
}, false);
推荐阅读
- java - 有没有办法防止 ObjectOutputStreams 被关闭的 JFrame 截断?
- python - Python 文本 RPG:如何保存/加载
- swift - 将 Firestore 中的对象数组快速映射到字典数组
- java - 使用嵌入式 SwingNode 调整 JavaFX 对话框的大小
- javascript - 组件外的 React Native 更新视图
- angular - 加载数据 mat-select-list 时出错“values.forEach 不是 MatSelectionList.push 的函数”
- firebase - Xcode 12:如何修复错误“archiveRootObject:toFile:”已弃用
- python - 构建 BasicDecoder TensorFlow 插件时出错
- javascript - Firebase 通过添加其值来更新单个字段
- javascript - 升级 babel 7 后开玩笑“spyOn”不起作用