jQuery - 在继续之前等待图像加载

时间:2015-06-22 20:19:39

标签: jquery canvas html5-canvas onload

在我目前正在处理的应用程序中,我有2个HTML5画布,我正在使用。一个(TempCanvas)用于临时绘制图表,另一个(MainCanvas)用于将图表传输到其上以进行演示。我有一个图像,我试图绘制到TempCanvas上,然后当它被加载时,我想将TempCanvas绘制到MainCanvas上。

我遇到的问题是在将图像绘制到TempCanvas之前,TempCanvas被绘制到MainCanvas上。有没有办法等到图像加载后继续代码?

我的主要职能:

1  // Draw the chart onto the TempCanvas
2  $(this).DrawChart(TempCanvas, OtherParams);
3  // Draw the TempCanvas onto the MainCanvas
4  MainCanvasContext.drawImage(TempCanvas.get(0), PositionX, PositionY);

DrawChart功能:

1  $.fn.DrawChart = function(TempCanvas, OtherParams)
2  {
3      var image = new Image();
4      image.onload = function()
5      {
6          TempCanvasContext.drawImage(image, PositionX, PositionY);
7          // Draw some other stuff on the TempCanvas.
8      }
9      image.src = FilePath;
10 }

基本上我正在寻找一种等待DrawChart Line 6在主线4执行之前完成执行的方法。任何指向正确方向的人都会非常感激。

2 个答案:

答案 0 :(得分:4)

otherParams对象中使用回调,如下所示:

  // Draw the chart onto the TempCanvas
  $(this).DrawChart(TempCanvas, { ...
      callback : function(){
          // THIS CODE WILL RUN ONLY AFTER IMAGE HAS LOADED
          // Draw the TempCanvas onto the MainCanvas
          MainCanvasContext.drawImage(TempCanvas.get(0), PositionX, PositionY);
      }
  });

DrawChart功能:

  $.fn.DrawChart = function(TempCanvas, OtherParams)
  {
      var image = new Image();
      image.onload = function()
      {
          TempCanvasContext.drawImage(image, PositionX, PositionY);
          // Draw some other stuff on the TempCanvas.
          otherParams.callback(); // NOW WE CAN CONTINUE RUNNING THE CODE
      }
      image.src = FilePath;
 }

一般来说,在设计jQuery插件时创建回调函数和/或事件是一个好习惯。它们非常有用,整个库都是以这种方式构建的。

请注意,您可以这样做:

image.onload = otherParams.callback;

并将整个处理程序作为参数传递。这是您的决定,应该符合您的需求。在你的情况下,最好保持原样。

答案 1 :(得分:2)

由于图像加载是Async,您还必须以异步方式绘制MainCanvasContext。实现这一目标的一种方法是使用jQuery.Deffered

  $.fn.DrawChart = function(TempCanvas, OtherParams)
  {
      var deferred = new $.Deferred();
      var image = new Image();
      image.onload = function()
      {
          TempCanvasContext.drawImage(image, PositionX, PositionY);
          // Draw some other stuff on the TempCanvas.

           deferred.resolve("I'm done");
      }
      image.src = FilePath;
      return deferred.promise();
}

$(this).DrawChart(TempCanvas, OtherParams).done(function(){
    MainCanvasContext.drawImage(TempCanvas.get(0), PositionX, PositionY);
});