【问题标题】:HTML5,Javascript canvas tag image.onload() issueHTML5,Javascript 画布标签 image.onload() 问题
【发布时间】:2012-08-02 15:05:34
【问题描述】:

    function LoadResources(){   
      alert("In load socket");

    var canvas   = document.getElementById("myCanvas");
    var context  = canvas.getContext("2d");
    var tiles= new Array();

    var loadedCount=0;
    for (x = 101; x <= 155; x++) {
      var imageObj = new Image(); // new instance for each image
      imageObj.src = "Resources/ClassicCardImages/deck1/dood_deck/"+x+".GIF";

      imageObj.onload=function(){
        loadedCount++;
        if(loadedCount==55){
            cardsImagesLoaded();
        }else {
          alert(loadedCount);
        }
      };
      tiles.push(imageObj);

     }
  };

因此,当我调用函数 LoadResources() 时,它确实会在“加载套接字中”发出警报,但在 imageObj.onload 函数中不会发出警报。

在html文档正文中使用时,您可以使用window.onload函数,即“window.onload = function() {..}”和我的函数。

另外我在谷歌浏览器上运行它。Chrome的onload有问题吗?

【问题讨论】:

    标签: javascript html canvas


    【解决方案1】:

    即使onload 函数仅被调用一次(在图像已完全加载的那一刻),您仍试图增加加载计数器,因此无法多次触发警报。对我来说,你想要做什么并不是很明显。无论如何,如果您想使用onload 函数加载多个图像,最佳做法是使用闭包,否则在每次迭代时,可能会在循环结束时仅加载最后一个图像。我不会详细介绍闭包是什么,但原理是这样的:

    for (var i = 0; i< 4; i++) {
        var imgObj = new Image();
        imgObj.onload = (function(img) {
    
            return function () {
                ctx.drawImage(imgObj, 0, 0);
            }
        })(i);
    
        imgObj.src = 'image.png';
    }
    

    这样,通过调用一个新函数,您将创建一个新的执行上下文,在每次迭代中保留i 的值。

    【讨论】:

    • 当我使用 window.onload() 它确实显示图像而不是函数名称并离线运行它不是从 localhost:8080 运行但只是从 src 路径运行它浏览器。顺便说一句我正在使用sockcet.io(node.js) 这和canvas onload方法有什么关系吗?
    【解决方案2】:

    我只是为您的代码添加一点帮助。

    要按照您的方式分配功能,按以下方式执行会更便宜。

     for (x = 101; x <= 155; x++) {
          var imageObj = new Image(); // new instance for each image
          imageObj.src = "Resources/ClassicCardImages/deck1/dood_deck/"+x+".GIF";
    
          imageObj.onload= imageOnLoad;
         }
    function imageOnLoad(){
            loadedCount++;
            if(loadedCount==55){
                cardsImagesLoaded();
            }else {
              alert(loadedCount);
            }
          };
          tiles.push(imageObj);
    }
    

    【讨论】:

    • 感谢您的帮助,但您知道代码有什么问题或解决 image.onload 问题的替代方法...任何排序帮助都会有所帮助