#javascript #html5-canvas
Вопрос:
Я пытаюсь рисовать изображения на холсте в цикле
В следующем коде, если я нажму «Далее«, 5 изображений появятся одно за другим. Если я нажму на Все, появится только последнее изображение
Что случилось?
<html>
<head>
<style>
.display-grid{
display: grid;
grid-template-columns: auto auto auto auto;
padding: 10px;
}
</style>
</head>
<body>
<div id="my-grid">
<div class="display-grid">
<span><canvas class="canvas" id="display-0"></canvas></span>
<span><canvas class="canvas" id="display-1"></canvas></span>
<span><canvas class="canvas" id="display-2"></canvas></span>
<span><canvas class="canvas" id="display-3"></canvas></span>
<span><canvas class="canvas" id="display-4"></canvas></span>
</div>
</div>
<button id="next-image">Next</button>
<button id="all-images">All</button>
<script type="text/javascript">
last_image = -1
var next_button= document.getElementById('next-image');
var all_button= document.getElementById('all-images');
next_button.onclick = function(){nextImage()};
all_button.onclick = function(){allImages()};
function nextImage() {
last_image
var canvas = document.getElementById('display-' last_image.toString());
var context = canvas.getContext('2d');
var imageObj = new Image();
imageObj.onload = function() {
context.drawImage(imageObj, 0, 0);
};
imageObj.src = 'image_' last_image.toString() '.png';
}
function allImages() {
for (index = 0; index < 5; index ) {
var canvas = document.getElementById('display-' index.toString());
var context = canvas.getContext('2d');
var imageObj = new Image();
imageObj.onload = function() {
context.drawImage(imageObj, 0, 0);
};
imageObj.src = 'image_' index.toString() '.png';
}
}
</script>
</body>
</html>
Ответ №1:
Это происходит потому onload
, что функция вызывается не в том же порядке, что и цикл. Для загрузки некоторых изображений может потребоваться больше времени, чем для загрузки других.
Вы можете исправить это, проверив имя изображения, чтобы узнать, какое изображение загружено, а затем узнать, на каком холсте оно должно быть нарисовано.
function allImages() {
for (let index = 0; index < 5; index ) {
let imageObj = new Image();
imageObj.name = "display-" index
imageObj.onload = function() {
console.log("loaded : " this.name)
let canvas = document.getElementById(this.name);
let context = canvas.getContext('2d');
context.drawImage(this, 0, 0);
};
imageObj.src = 'image_' index '.png';
}
}