【问题标题】:How to execute a function after another one that has an onload function inside it?如何在另一个具有 onload 函数的函数之后执行一个函数?
【发布时间】:2018-09-02 23:54:16
【问题描述】:
  • 我想在画布上显示图像(动态地)然后重置它。
  • drawImage() 是在其源加载后在画布上绘制图像的函数。
  • resetCanvas() 是重置/清理画布的函数。

    var canvas = document.getElementById("Canvas");
    const ctx = canvas.getContext("2d");
    
    drawImage("img/earth.jpg");
    resetCanvas();
    //more code
    
    function resetCanvas() {
        ctx.clearRect(0, 0, canvas.width, canvas.height);
    }
    
    function drawImage(source) {
        var img = new Image();
        img.onload = function() {
            var x = img.width;
            var y = img.height;
            adjustCanvasSize(x, y);
            ctx.drawImage(img,0,0, x, y);
        }
        img.src = source;
    }
    

当我执行此代码时,resetCanvas() 被“忽略”。我不想在 drawImage() 的 onload 函数中插入 resetCanvas(),因为它实际上代表了许多其他不同的函数和将要执行的指令在 drawImage() 之后,它看起来会出错。

我在想是否有办法让 javascript 更有耐心并阻止它执行任何操作,直到图像被加载到 drawImage 函数中。

【问题讨论】:

  • and it would look wrong. 实际上,这听起来像是完美的解决方案,对我来说听起来不错。如果你有很多图片需要在重置之前先加载,那么使用 Promises 和Promise.all
  • 你可以有一个变量 boolean 叫做: var imageLoaded = false;然后在加载图像时将其设置为 true,但由于图像加载是在另一个线程上发生的,因此您可以处于一个 while 循环中,该循环不断检查 imageLoaded 是否为 true,并且在此之前它不会继续。
  • 我的解决方案可能不受欢迎,但它是实现您想要的一种方式

标签: javascript canvas onload onload-event


【解决方案1】:

几个cmets:

  1. 如果您在绘制图像后重置画布,您将看不到图像,因为 resetCanvas 函数正在删除您之前在画布上绘制的所有内容

  2. 在画布中处理图像时存在一些问题。请阅读这篇文章:MDM Using images

接下来是我的代码。希望对你有帮助。

var canvas = document.getElementById("Canvas");
const ctx = canvas.getContext("2d");
resetCanvas();
drawImage("https://cdn.sstatic.net/Sites/*/img/404.svg");

//more code

function resetCanvas() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
}

function drawImage(source) {
    var img = new Image();
    img.onload = function() {
        var x = img.width;
        var y = img.height;
        adjustCanvasSize(canvas,x, y);
        ctx.drawImage(img,0,0, x, y);
    }
    img.src = source;
}


function adjustCanvasSize(canvas, x, y){
  canvas.width = x;
  canvas.height = y;  
}
canvas{border:1px solid;}
<canvas id="Canvas"></canvas>

【讨论】: