javascript - 如何清理画布并重新绘制
问题描述
所以我做了一个简单的例子,如果你点击一个画布,它会一直画随机线,它还会将当前状态推入_history
变量,一旦你点击“获取上一个”按钮,它就会弹出上一个状态。
var _history = []
var canvas = document.getElementsByClassName('canvas')[0];
var ctx = canvas.getContext('2d');
canvas.addEventListener('click', generateLine, false);
var btn = document.getElementsByClassName('btn')[0];
btn.addEventListener('click', loadPrevious, false);
var img = document.getElementsByClassName('img')[0];
function generateLine() {
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(Math.random() * 200, Math.random() * 200);
ctx.stroke();
var value = canvas.toDataURL();
console.log(value);
_history.push(value);
}
function loadPrevious() {
_history.pop();
var value = _history.pop();
img.src = value;
// clear data
ctx.clearRect(0, 0, canvas.width, canvas.height);
// re-draw
ctx.drawImage(img, 0, 0);
}
.canvas {
width: 100px;
height: 100px;
border: 1px solid black;
}
.app {
text-align: center;
}
img {
display: none;
}
<div class="App">
<img alt="test" class="img" />
Click on the image to draw random: <br />
<canvas class="canvas"></canvas>
<br />
<button class="btn">load previous state</button>
</div>
_history
数组很好,当我弹出一个状态时,它会返回一个很好的 URI 图像,但我认为将状态“加载”到画布的部分被破坏了。
我该如何解决?
解决方案
调用内存中的图像是异步的,因此您需要将其包装在一个img.onload
函数中。
var _history = []
var canvas = document.getElementsByClassName('canvas')[0];
var ctx = canvas.getContext('2d');
canvas.addEventListener('click', generateLine, false);
var btn = document.getElementsByClassName('btn')[0];
btn.addEventListener('click', loadPrevious, false);
var img = document.getElementsByClassName('img')[0];
function generateLine() {
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(Math.random() * 200, Math.random() * 200);
ctx.stroke();
var value = canvas.toDataURL();
console.log(value);
_history.push(value);
}
function loadPrevious() {
_history.pop();
var value = _history.pop();
img.src = value;
// clear data
ctx.clearRect(0, 0, canvas.width, canvas.height);
// re-draw
img.onload = function() {
ctx.drawImage(img, 0, 0);
};
}
<style>
.canvas {
width: 100px;
height: 100px;
border: 1px solid black;
}
.app {
text-align: center;
}
img {
display: none;
}
</style>
<div class="App">
<img alt="test" class="img" />
Click on the image to draw random: <br />
<canvas class="canvas"></canvas>
<br />
<button class="btn">load previous state</button>
</div>
推荐阅读
- javascript - 为什么 onclick 仅在您单击两次时才有效?
- c# - 问题放弃对控制的关注
- join - Flink - 加入同一流以过滤某些事件
- c# - 大摇大摆的 IAuthorizationFilter 和 IOperationFilter
- filter - Splunk 如何从列表中排除某个值(如果存在)
- javascript - 如何将数据 url 转换为有效 url,以便它可以通过 Graph API 发布在 Facebook 页面上?
- javascript - 无法使用 puppeteer 将绑定/curried/closure 函数从节点传递到浏览器
- c# - Microsoft Graph SDK 请求批处理响应的下一个链接
- excel - 通过 VBA 更新表
- c++ - 静态库的链接和加载